﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web.Mvc;
using SIBI.Models;
using PagedList;
using System.Net.Mail;
using System.IO;
using System.Web;
using System.Xml;
using System.Collections;
using System.Net.Mime;
using Lib.Web.Mvc.JQuery.JqGrid;
using System.Text;

namespace SIBI.Controllers
{
    [Authorize]
    public class BienInformaticoController : Controller
    {
	
		//Crear contexto de conexión con la BD SIBI
        private SIBIContext db = new SIBIContext();
		
		//Crear contexto de conexión con la BD TEJECUTIVO
        private TEJECUTIVOContext db1 = new TEJECUTIVOContext();

        //***********************************************************************************//
        // Autor:  									                	     				*//
        //***********************************************************************************//
        // Index()													 						*//
        // Función que devuelve la vista de todos los ítems de BI listados en la pantalla.	*// 
        // _________________________________________________________________________________*//
        // Entrada: None                                        							*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que posee todos los bienes informáticos listados 					*//
        // _________________________________________________________________________________*//
        public ViewResult Index()
        {
            var bieninformaticoes = db.BienInformaticoes.Include(b => b.nest).Include(b => b.ntib).Include(b => b.nsoc).Include(b => b.ndiv).Include(b => b.ncar).Include(b => b.nmym);
            return View(bieninformaticoes.ToList());
        }

        //***********************************************************************************//
        // Autor:  										                     				*//
        //***********************************************************************************//
        // SearchIndex()		Acceso INVITADO	y ADMINISTRADOR								*//
        // Acción que devuelve la vista de todos los ítems de BI listados, paginados y con 	*//
        // opción de búsqueda.		 														*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	msnCorreo: mensaje que indica si se logró enviar el correo electrónico de 	*//
        //		notificación de movimiento o  no.											*//
        // •	Page: entero que denota el numero de pagina que se tiene en la lista de 	*//
        // 		búsqueda, por defecto es 1.													*//
        // •	Parámetros con prefijo search: caracteres por los cuales se va a filtrar la *//
        // 		búsqueda. 																	*//
        // •	Parámetros con prefijo current: caracteres que guardan la ultima búsqueda de*// 
        // 		filtrado para mantenerla durante los cambios de página. 					*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que posee todos los bienes informáticos listados deseados			*//
        // _________________________________________________________________________________*//
        public ActionResult SearchIndex(string msnCorreo, string currentSerial, 
                            string searchSerial, string currentEst, 
                            string searchEst, string currentTipo, 
                            string searchTipo, string currentUbi, 
                            string searchClaseObjeto, string currentAct, 
                            string searchAct, string currentRes, 
                            string searchRes, int? page = 1)
        {
            var bi = db.BienInformaticoes.Include(b => b.nest).Include(b => b.ntib).Include(b => b.nsoc).Include(b => b.ndiv)
                .Include(b => b.ncar).Include(b => b.nmym);

			//Metodo GET Inicializar las variables con los valores de busqueda introducidos
            if (Request.HttpMethod == "GET")
            {
                searchSerial = currentSerial;
                searchClaseObjeto = currentUbi;
                searchEst = currentEst;
                searchTipo = currentTipo;

                searchAct = currentAct;
                searchRes = currentRes;
            }
            else
            {
                page = 1;
            }
			
			//Metodo POST Inicializar las variables con los valores de busqueda introducidos
            ViewBag.CurrentSerial = searchSerial;
            ViewBag.CurrentUbi = searchClaseObjeto;
            ViewBag.CurrentEst = searchEst;
            ViewBag.CurrentTipo = searchTipo;
            ViewBag.msnCorreo = msnCorreo;

            ViewBag.CurrentAct = searchAct;
            ViewBag.CurrentRes = searchRes;

            int pageSize = 10;
            int pageIndex = (page ?? 1) - 1;

            //Filtrado por los parametros en entrada capturado en al interfaz
            if (!String.IsNullOrEmpty(searchSerial))
            {
                bi = bi.Where(s => s.BienInformaticoId.Contains(searchSerial));
            }

            if (!String.IsNullOrEmpty(searchClaseObjeto))
            {
                bi = bi.Where(s => s.nmym.ncob.cnom.Contains(searchClaseObjeto));
            }

            if (!String.IsNullOrEmpty(searchEst))
            {
                bi = bi.Where(s => s.nest.cnom.Contains(searchEst));
            }

            if (!String.IsNullOrEmpty(searchTipo))
            {
                bi = bi.Where(s => s.ntib.cnom.Contains(searchTipo));
            }

            if (!String.IsNullOrEmpty(searchAct))
            {
                bi = bi.Where(s => s.nanf.Equals(searchAct));
            }

            if (!String.IsNullOrEmpty(searchRes))
            {
                bi = bi.Where(s => s.ncar.empleados.Contains(searchRes));
            }

			//Ordenar los BI del return
            bi = bi.OrderBy(x => x.BienInformaticoId);
            List<string> localidades = new List<string>();
            List<BienInformatico> lbi;
            if(bi.Count() > 10)
                if(bi.Count() - (pageIndex * pageSize) < 11)
                    lbi = bi.ToList().GetRange(pageIndex * pageSize, bi.Count() - (pageIndex * pageSize));
                else
                    lbi = bi.ToList().GetRange(pageIndex * pageSize, pageSize);
            else
                lbi = bi.ToList().GetRange(pageIndex * pageSize, bi.Count());
            var i = 1;
            foreach(var bbii in lbi){
                if (i > pageSize) break;
                if (bbii.ncar == null) {
                    try {
                        localidades.Add( 
                                        (from loc in db1.LOCALIDAD
                                        where loc.localidad_id == bbii.localidad_id
                                        select loc.localidad_nombre).First().ToString()
                                       );
                    } catch {
                        localidades.Add("");
                    }
                } else {
                    localidades.Add("");
                }
                i = i + 1;
            }

            ViewBag.Localidades = localidades;
            return View(bi.ToPagedList(pageIndex, pageSize));
        }

        //***********************************************************************************//
        // Autor:  									                	     				*//
        //***********************************************************************************//
        // RetiroResguardo()	Acceso solo ADMINISTRADOR									*//
        // Acción que devuelve la vista de todos los ítems de BI resguardables listados,  	*//
        // paginados y con opción de búsqueda.		 										*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	msnCorreo: mensaje que indica si se logró enviar el correo electrónico de 	*//
        //		notificación de movimiento o  no.											*//
        // •	Page: entero que denota el numero de pagina que se tiene en la lista de 	*//
        // 		búsqueda, por defecto es 1.													*//
        // •	Parámetros con prefijo search: caracteres por los cuales se va a filtrar la *//
        // 		búsqueda. 																	*//
        // •	Parámetros con prefijo current: caracteres que guardan la ultima búsqueda de*// 
        // 		filtrado para mantenerla durante los cambios de página. 					*//
        // •	TipoRes: denota el  tipo de resguardo que se está manejando, puede ser 		*//
        //		básico TipoRes = 2 o revisión TipoRes = 6. 									*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que posee todos los bienes informáticos listados deseados			*//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult RetiroResguardo(int? tipoRes, string msnCorreo, 
                            string currentSerial, string searchSerial, 
                            string currentEst, string searchEst, 
                            string currentTipo, string searchTipo, 
                            string currentAct, string searchAct, 
                            string currentRes, string searchRes, 
                            string currentUbi, string searchClaseObjeto, 
                            int? page = 1)
        {

            var bi = db.BienInformaticoes.Include(b => b.nest).Include(b => b.ntib).Include(b => b.nsoc).Include(b => b.ndiv).Include(b => b.ncar).Include(b => b.nmym);

			//Metodo GET Inicializar las variables con los valores de busqueda introducidos
            if (Request.HttpMethod == "GET")
            {
                searchSerial = currentSerial;
                searchClaseObjeto = currentUbi;
                searchEst = currentEst;
                searchTipo = currentTipo;
                ViewBag.tipoRes = tipoRes;

                searchAct = currentAct;
                searchRes = currentRes;
            }
            else
            {
                page = 1;
            }
			
			//Metodo POST Inicializar las variables con los valores de busqueda introducidos
            ViewBag.msnCorreo = msnCorreo;
            ViewBag.CurrentSerial = searchSerial;
            ViewBag.CurrentUbi = searchClaseObjeto;
            ViewBag.CurrentEst = searchEst;
            ViewBag.CurrentTipo = searchTipo;
            ViewBag.tipoRes = tipoRes;

            ViewBag.CurrentAct = searchAct;
            ViewBag.CurrentRes = searchRes;

            int pageSize = 10;
            int pageIndex = (page ?? 1) - 1;

            //Filtrado de lista de Bienes Informáticos, solo Asignados y Prestados
            bi = bi.Where(s => s.EstadoId == 1 || s.EstadoId == 4);

            //Filtrado por los parametros en entreda capturado en al interfaz
            if (!String.IsNullOrEmpty(searchSerial))
            {
                bi = bi.Where(s => s.BienInformaticoId.Contains(searchSerial));
            }

            if (!String.IsNullOrEmpty(searchClaseObjeto))
            {
                bi = bi.Where(s => s.nmym.ncob.cnom.Contains(searchClaseObjeto));
            }

            if (!String.IsNullOrEmpty(searchEst))
            {
                bi = bi.Where(s => s.nest.cnom.Contains(searchEst));
            }

            if (!String.IsNullOrEmpty(searchTipo))
            {
                bi = bi.Where(s => s.ntib.cnom.Contains(searchTipo));
            }

            if (!String.IsNullOrEmpty(searchAct))
            {
                bi = bi.Where(s => s.nanf.Contains(searchAct));
            }

            if (!String.IsNullOrEmpty(searchRes))
            {
                bi = bi.Where(s => s.ncar.empleados.Contains(searchRes));
            }

			//Ordenar los BI del return
            bi = bi.OrderBy(x => x.BienInformaticoId);
            List<string> localidades = new List<string>();
            List<BienInformatico> lbi;
            if (bi.Count() > 10)
                if (bi.Count() - (pageIndex * pageSize) < 11)
                    lbi = bi.ToList().GetRange(pageIndex * pageSize, bi.Count() - (pageIndex * pageSize));
                else
                    lbi = bi.ToList().GetRange(pageIndex * pageSize, pageSize);
            else
                lbi = bi.ToList().GetRange(pageIndex * pageSize, bi.Count());
            var i = 1;
            foreach (var bbii in lbi)
            {
                if (i > pageSize) break;
                if (bbii.ncar == null)
                {
                    try
                    {
                        localidades.Add(
                                        (from loc in db1.LOCALIDAD
                                         where loc.localidad_id == bbii.localidad_id
                                         select loc.localidad_nombre).First().ToString()
                                       );
                    }
                    catch
                    {
                        localidades.Add("");
                    }
                }
                else
                {
                    localidades.Add("");
                }
                i = i + 1;
            }

            ViewBag.Localidades = localidades;
            return View(bi.ToPagedList(pageIndex, pageSize));
        }

        //***********************************************************************************//
        // Autor:  									                	     				*//
        //***********************************************************************************//
        // RetiroDesincorporacion()	Acceso solo ADMINISTRADOR								*//
        // Acción que devuelve la vista de todos los ítems de BI desincorporables listados, *//
        // paginados y con opción de búsqueda.		 										*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	msnCorreo: mensaje que indica si se logró enviar el correo electrónico de 	*//
        //		notificación de movimiento o  no.											*//
        // •	Page: entero que denota el numero de pagina que se tiene en la lista de 	*//
        // 		búsqueda, por defecto es 1.													*//
        // •	Parámetros con prefijo search: caracteres por los cuales se va a filtrar la *//
        // 		búsqueda. 																	*//
        // •	Parámetros con prefijo current: caracteres que guardan la ultima búsqueda de*// 
        // 		filtrado para mantenerla durante los cambios de página. 					*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que posee todos los bienes informáticos listados deseados			*//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult RetiroDesincorporacion(string msnCorreo, string currentSerial, 
                            string searchSerial, string currentTipo, 
                            string searchClaseObjeto, string currentLocalidad, 
                            string searchLocalidad, int? page = 1)
        {

            var bi = db.BienInformaticoes.Include(b => b.nest).Include(b => b.ntib).Include(b => b.nsoc).Include(b => b.ndiv).Include(b => b.ncar).Include(b => b.nmym);

			//Metodo GET Inicializar las variables con los valores de busqueda introducidos
            if (Request.HttpMethod == "GET")
            {
                searchSerial = currentSerial;
                searchLocalidad = currentLocalidad;
                searchClaseObjeto = currentTipo;
            }
            else
            {
                page = 1;
            }
			
			//Metodo POST Inicializar las variables con los valores de busqueda introducidos
            ViewBag.msnCorreo = msnCorreo;
            ViewBag.CurrentSerial = searchSerial;
            ViewBag.CurrentLocalidad = searchLocalidad;
            ViewBag.CurrentTipo = searchClaseObjeto;

            int pageSize = 10;
            int pageIndex = (page ?? 1) - 1;

            //Filtrado de lista de Bienes Informáticos, solo Resguardados
            bi = bi.Where(s => s.EstadoId == 2 || s.EstadoId == 6);

            //Filtrado por los parametros en entreda capturado en al interfaz
            if (!String.IsNullOrEmpty(searchSerial))
            {
                bi = bi.Where(s => s.BienInformaticoId.Contains(searchSerial));
            }

            if (!String.IsNullOrEmpty(searchLocalidad))
            {
                bi = bi.Where(s => s.localidad_id == searchLocalidad);
            }

            if (!String.IsNullOrEmpty(searchClaseObjeto))
            {
                bi = bi.Where(s => s.nmym.ncob.cnom.Contains(searchClaseObjeto));
            }

			//Ordenar los BI del return
            bi = bi.OrderBy(x => x.BienInformaticoId);
            return View(bi.ToPagedList(pageIndex, pageSize));
        }

        //***********************************************************************************//
        // Autor:  									                	     				*//
        //***********************************************************************************//
        // GetSerialesAsignacion()															*//
        // Función que devuelve la vista de todos los ítems de BI que están resguardados, 	*// 
        // para asi listarlos en las funciones de autocompletado del sistema. 				*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	query: String llenado en el autocompletado, utilizado para buscar			*//
        // 		los BI que coincidan en BD.	 												*//
        // _________________________________________________________________________________*//
        // Salida:  Arreglo que posee todos los BI que conciden con el String de busqueda.	*//
        // _________________________________________________________________________________*//
        public ActionResult GetSerialesAsignacion(string query)
        {
			//Filtrado de los BI por los paremetros de entrada
            var bis = (from bi in db.BienInformaticoes
                       where bi.EstadoId == 2 &&
                            (
                                bi.BienInformaticoId.Contains(query) ||
                                bi.nest.cnom.Contains(query) ||
                                bi.nmym.ncob.cnom.Contains(query) ||
                                bi.ntib.cnom.Contains(query) ||
                                bi.nmym.cmod.Contains(query) ||
                                (bi.BienInformaticoId + " " + bi.nest.cnom + " " + bi.nmym.ncob.cnom + " " + bi.ntib.cnom + " " + bi.nmym.cmod).Contains(query)
                            )
                       select new
                       {
                           BienInformaticoId = bi.BienInformaticoId,
                           ClaseObjecto = bi.nmym.ncob.cnom,
                           Estado = bi.nest.cnom,
                           TipoBien = bi.ntib.cnom,
                           MarcaModelo = bi.nmym.cmod,
                           NAnexo = bi.nanf,
                           NEtiq = bi.nena
                       }).Take(15).ToArray();
            return Json(bis);
        }

        //***********************************************************************************//
        // Autor:  							     	                						*//
        //***********************************************************************************//
        // GetSeriales()																	*//
        // Función que devuelve la vista de todos los ítems de BI , para asi listarlos en 	*// 
        // las funciones de autocompletado del sistema. 									*//
        // _________________________________________________________________________________*//
        // Entrada:																			*//
        // •	query: String llenado en el autocompletado, utilizado para buscar			*//
        // 		los BI que coincidan en BD.	 												*//
        // _________________________________________________________________________________*//
        // Salida:  Arreglo que posee todos los BI que conciden con el String de busqueda.	*//
        // _________________________________________________________________________________*//
        public ActionResult GetSeriales(string query)
        {
            var querySplit = query.Split(' ');
            var bar = "";
            var foo = "";
            var baz = "";
            var qux = "";
            var foobar = "";
			
			//Obtención de los Paremetros de entrada
            if (querySplit.Length == 1)
            {
                bar = querySplit[0];
            }
            else if (querySplit.Length == 2)
            {
                bar = querySplit[0];
                foo = querySplit[1];
            }
            else if (querySplit.Length == 3)
            {
                bar = querySplit[0];
                foo = querySplit[1];
                baz = querySplit[2];
            }
            else if (querySplit.Length == 4)
            {
                bar = querySplit[0];
                foo = querySplit[1];
                baz = querySplit[2];
                qux = querySplit[3];
            }
            else if (querySplit.Length == 5)
            {
                bar = querySplit[0];
                foo = querySplit[1];
                baz = querySplit[2];
                qux = querySplit[3];
                foobar = querySplit[4];
            }

			//Filtrado de los BI por los paremetros de entrada
            var bis = (from bi in db.BienInformaticoes
                       where bi.EstadoId != 5 &&
                           (bi.BienInformaticoId + bi.nest.cnom + bi.nmym.ncob.cnom + bi.ntib.cnom + bi.nmym.cmod).Contains(bar) &&
                           (bi.BienInformaticoId + bi.nest.cnom + bi.nmym.ncob.cnom + bi.ntib.cnom + bi.nmym.cmod).Contains(foo) &&
                           (bi.BienInformaticoId + bi.nest.cnom + bi.nmym.ncob.cnom + bi.ntib.cnom + bi.nmym.cmod).Contains(baz) &&
                           (bi.BienInformaticoId + bi.nest.cnom + bi.nmym.ncob.cnom + bi.ntib.cnom + bi.nmym.cmod).Contains(qux) &&
                           (bi.BienInformaticoId + bi.nest.cnom + bi.nmym.ncob.cnom + bi.ntib.cnom + bi.nmym.cmod).Contains(foobar)
                       select new
                       {
                           BienInformaticoId = bi.BienInformaticoId,
                           ClaseObjecto = bi.nmym.ncob.cnom,
                           Estado = bi.nest.cnom,
                           TipoBien = bi.ntib.cnom,
                           MarcaModelo = bi.nmym.cmod,
                           NAnexo = bi.nanf,
                           NEtiq = bi.nena
                       }).Take(15).ToArray();
            return Json(bis);
        }

        //***********************************************************************************//
        // Autor:  									                	     				*//
        //***********************************************************************************//
        // GetLastAnexo()																	*//
        // Función que devuelve el número de la ultima etiqueta del anexo proporcionado, o 1*//
        // si el anexo es nuevo.															*//
        // _________________________________________________________________________________*//
        // Entrada:																			*//
        // •	query: String llenado en el autocompletado, utilizado para buscar el anexo	*//
        //  	y generar el numero de etiqueta	 											*//
        // _________________________________________________________________________________*//
        // Salida:  Arreglo que posee el número de etiqueta generado.						*//
        // _________________________________________________________________________________*//
        public ActionResult GetLastAnexo(string query)
        {
			//Busqueda de anexo
            var anexo = (from bi in db.BienInformaticoes
                         where bi.nanf == query
                         orderby bi.nena descending
                         select bi.nena).FirstOrDefault();

            string[] array;

			//Verificación de si el anexo existe o es nuevo para asignar un etiqueta
            if (anexo == null)
            {
                array = new string[] { "1" };
                return Json(array);
            }
            else
            {
                var a = Convert.ToInt64(anexo);
                a++;
                array = new string[] { a.ToString() };
                return Json(array);
            }
        }
		
        //***********************************************************************************//
        // Autor:  								                		     				*//
        //***********************************************************************************//
        // Details()	Acceso INVITADO	y ADMINISTRADOR										*//
        // Función que devuelve la vista de los detalles de un BI especificado.	 			*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	id: identificador del BI que se desea ver los detalles. 					*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que posee todos los datos del BI desado.							*//
        // _________________________________________________________________________________*//
        public ViewResult Details(string id)
        {
            BienInformatico bieninformatico = db.BienInformaticoes.Find(id);

			//Busqueda de los Datos de la BD TEJECUTIVO Ceco
            var ceco = from m in db1.CECO
                       where m.ceco_id == bieninformatico.ceco_id
                       select m.ceco_descripcion;
            ViewBag.ceco_id = ceco;

			//Busqueda de los Datos de la BD TEJECUTIVO Localidad
            var localidad = from m in db1.LOCALIDAD
                            where m.localidad_id == bieninformatico.localidad_id
                            select m.localidad_nombre;

            ViewBag.localidad_id = localidad;

            var padre = from m in db.BienInformaticoes
                        where m.BienInformaticoId == bieninformatico.PadreId
                        select m.BienInformaticoId;

            ViewBag.padre_id = padre;

            return View(bieninformatico);
        }

        //***********************************************************************************//
        // Autor:  										                     				*//
        //***********************************************************************************//
        // Resguardo()	Acceso solo ADMINISTRADOR											*//
        // Acción que devuelve la vista para resguardar un BI nuevo. Método GET.			*//
        // _________________________________________________________________________________*//
        // Entrada: none																	*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve la plantilla para resguardo un BI.					*//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult Resguardo()
        {
			//Metodo GET Inicializar las variables con los valores predeterminados
            ViewBag.ceco_id = new SelectList(db1.CECO, "ceco_id", "ceco_descripcion", "7280600000");
            ViewBag.localidad_id = new SelectList(db1.LOCALIDAD, "localidad_id", "localidad_nombre", "0002");

            ViewBag.EstadoId = new SelectList(db.Estadoes, "EstadoId", "cnom", 2);
            ViewBag.TipoBienId = new SelectList(db.TipoBiens, "TipoBienId", "cnom");
            ViewBag.SociedadId = new SelectList(db.Sociedads, "SociedadId", "cscc", 1);
            ViewBag.DivisionId = new SelectList(db.Divisions, "DivisionId", "cper", "0000");
            ViewBag.CargoId = new SelectList(db.Cargoes, "CargoId", "cdes", "DEPOSITO");
            ViewBag.MarcaModeloId = "";
            return View();
        }

        //***********************************************************************************//
        // Autor:  										                     				*//
        //***********************************************************************************//
        // Resguardo()	Acceso solo ADMINISTRADOR											*//
        // Acción que devuelve la vista para resguardar un BI nuevo. Método POST.			*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	bieninformatico: dato de tipo modelo que representa un bien informático, 	*//
        // 		este es requerido para verificar que los datos suministrados son correctos, *//
        //		para así resguardar o enviar un mensaje de error en la aplicación. 			*//
        // •	Subject: caracteres que se van a anexar al asunto original del correo 		*//
        //		electrónico. 																*//
        // •	Body: caracteres que se van a anexar al cuerpo original del correo 			*//
        //		electrónico. 																*//
        // •	Parametros con sufijo Visible: String utilizado para el manejo del 			*//
        // 		autocompletado de campos. 													*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve el BI resguardado.									*//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        [HttpPost]
        public ActionResult Resguardo(BienInformatico bieninformatico, string subject, string body, string MarcaModeloId_Visible)
        {
			//Verificación de correctitud en los rangos de fecha
            var valid = false;
            if (bieninformatico.diga > bieninformatico.dfga) valid = false;
            else
            {
                valid = true;
                ViewBag.Fail = "";
            }

			//Verificación de que no se repita el nuevo serial
            var validSerial = (from m in db.BienInformaticoes
                               where m.BienInformaticoId == bieninformatico.BienInformaticoId
                               select m.BienInformaticoId).ToList();

			//Verificación de que para todo BI arrendado se bede colocar un Anexo y Etiqueta
            var validAnexo = false;
            if ((bieninformatico.TipoBienId == 1 && bieninformatico.nanf != null && bieninformatico.nena != null)
                || bieninformatico.TipoBienId > 1)
            {
                validAnexo = true;
            }

            if (validAnexo)
            {
                if (validSerial.Count() == 0)
                {
                    if (valid)
                    {
                        if (ModelState.IsValid)//Verificaciòn del Modelo
                        {

                            // Verificar que el serial no tenga espacios dummies
                            bieninformatico.BienInformaticoId = bieninformatico.BienInformaticoId.Trim();
                            db.BienInformaticoes.Add(bieninformatico);
                            db.SaveChanges();

                            var cargoN = (from m in db.Cargoes
                                          where m.CargoId == bieninformatico.CargoId
                                          select m).ToList().FirstOrDefault();

                            var obs = "Cargo involucrado en movimiento. " + cargoN.cdes.Replace('.', ' ') + ", " + cargoN.empleados.Replace('.', ' ') + "."; 

							// Carga Movimiento
                            creacionMovimiento("Entrada", obs, bieninformatico.cubf, 
                                    bieninformatico.localidad_id, bieninformatico.EstadoId, 
                                        bieninformatico.BienInformaticoId);
						
                            //--------------------------------  Envio de Correo  ------------------------------//
                            var msnCorreo = "";
                            //Obtención de la marca modelo
                            var marcaModelo = (from c in db.MarcaModeloes
                                               where c.MarcaModeloId == bieninformatico.MarcaModeloId
                                               select c.ncob.cnom).ToList();
							//Creación de los Datos del correo
                            var subjectSend = "Coordinación de Bienes Informáticos. " + subject;
                            var bodySend = " el resguardo del Bien Informático de tipo " + marcaModelo.FirstOrDefault() + ", con serial '" + bieninformatico.BienInformaticoId +
                                            "' a Depósito en la localidad Centro Monaca. <br /><br />" + body;
							//Busqueda de los correos destinatorios
                            var cc = (from m in db.ControlCorreos
                                      where m.CausaMovimientoId == bieninformatico.EstadoId
                                      select m.ccor).First();
                            try
                            {
								//Envio de correo
                                sendEmail(cc, subjectSend, bodySend, true);
                                msnCorreo = "Se envió el correo satisfactoriamente";
                            }
                            catch (Exception)
                            {
                                msnCorreo = "No se pudo enviar el correo debido a problemas con el servidor";
                            }
                            //--------------------------------  FIN Envio de Correo  ------------------------------//

                            return RedirectToAction("PreviewAdquision", new { id = bieninformatico.BienInformaticoId, msnCorreo = msnCorreo });
                        }
                    }
                    else
                        ViewBag.Fail = "Error en los rangos de las fechas.";
                }
                else
                    ViewBag.FailSerial = "El serial ya existe.";
            }
            else
                ViewBag.FailAnexo = "El tipo de BI arrendado requiere el número de anexo y etiqueta.";

            /*correo*/
            ViewBag.subject = subject;
            ViewBag.body = body;
            /*correo*/

			//Metodo POST Inicializar las variables con los valores de busqueda introducidos
            ViewBag.MarcaModeloId_Visible = MarcaModeloId_Visible;
            ViewBag.ceco_id = new SelectList(db1.CECO, "ceco_id", "ceco_descripcion", bieninformatico.ceco_id);
            ViewBag.localidad_id = new SelectList(db1.LOCALIDAD, "localidad_id", "localidad_nombre", bieninformatico.localidad_id);

            ViewBag.EstadoId = new SelectList(db.Estadoes, "EstadoId", "cnom", bieninformatico.EstadoId);
            ViewBag.TipoBienId = new SelectList(db.TipoBiens, "TipoBienId", "cnom", bieninformatico.TipoBienId);
            ViewBag.SociedadId = new SelectList(db.Sociedads, "SociedadId", "cscc", bieninformatico.SociedadId);
            ViewBag.DivisionId = new SelectList(db.Divisions, "DivisionId", "cper", bieninformatico.DivisionId);
            ViewBag.CargoId = new SelectList(db.Cargoes, "CargoId", "cdes", bieninformatico.CargoId);
            ViewBag.MarcaModeloId = bieninformatico.MarcaModeloId;

            return View(bieninformatico);
        }

        //***********************************************************************************//
        // Autor:  										                       				*//
        //***********************************************************************************//
        // Asignacion()	Acceso solo ADMINISTRADOR											*//
        // Acción que devuelve la vista para asignar un BI nuevo. Método GET.				*//
        // _________________________________________________________________________________*//
        // Entrada: none																	*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve la plantilla para asignar un BI.						*//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult Asignacion()
        {
			//Metodo GET Inicializar las variables con los valores predeterminados
            ViewBag.PadreId = "";
            ViewBag.ceco_id = "";
            ViewBag.localidad_id = "";

            ViewBag.EstadoId = new SelectList(db.Estadoes, "EstadoId", "cnom", 1);
            ViewBag.TipoBienId = new SelectList(db.TipoBiens, "TipoBienId", "cnom");
            ViewBag.SociedadId = new SelectList(db.Sociedads, "SociedadId", "cscc", 1);
            ViewBag.DivisionId = new SelectList(db.Divisions, "DivisionId", "cper");
            ViewBag.CargoId = "";
            ViewBag.MarcaModeloId = null;
            return View();
        }

        //***********************************************************************************//
        // Autor:  										                     				*//
        //***********************************************************************************//
        // Asignacion()	Acceso solo ADMINISTRADOR											*//
        // Acción que devuelve la vista para asignar un BI nuevo. Método POST.				*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	bieninformatico: dato de tipo modelo, que representa un bien informático, 	*//
        //		este es requerido para verificar que los datos suministrados son correctos, *// 
        //		para así asignar o enviar un mensaje de error en la aplicación.				*//
        // •	Nombre: nombre del responsable del bien informático.						*//
        // •	Email: correo que va a anexar a la lista de destinatarios del correo 		*//
        // 		electrónico.																*//
        // •	Subject: caracteres que se van a anexar al asunto original del correo 		*//
        //		electrónico.  																*//
        // •	Body: caracteres que se van a anexar al cuerpo original del correo 			*//
        // 		electrónico.																*// 
        // •	Parametros con sufijo Visible: String utilizado para el manejo del 			*//
        // 		autocompletado de campos. 													*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve el BI asignado.										*//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        [HttpPost]
        public ActionResult Asignacion(BienInformatico bieninformatico, string nombre, 
                        string email, string subject, 
                        string body, string MarcaModeloId_Visible, 
                        string ceco_id_Visible, string CargoId_Visible, 
                        string localidad_id_Visible)
        {

			//Verificación de correctitud en los rangos de fecha
            var valid = false;
            var envioCorreo = false;
            if (bieninformatico.diga > bieninformatico.dfga) valid = false;
            else
            {
                valid = true;
                ViewBag.Fail = "";
            }

			//Verificación de que no se repita el nuevo serial
            var validSerial = (from m in db.BienInformaticoes
                               where m.BienInformaticoId == bieninformatico.BienInformaticoId
                               select m.BienInformaticoId).ToList();
							   
			//Verificación de que para todo BI arrendado se bede colocar un Anexo y Etiqueta
            var validAnexo = false;
            if ((bieninformatico.TipoBienId == 1 && bieninformatico.nanf != null && bieninformatico.nena != null)
                || bieninformatico.TipoBienId > 1)
            {
                validAnexo = true;
            }
			
            if (validAnexo)
            {
                if (validSerial.Count() == 0)
                {
                    if (email != string.Empty)
                    {
                        if (valid)
                        {
                            if (ModelState.IsValid)//Verificación del modelo
                            {

                                // Verificar que el serial no tenga espacios dummies
                                bieninformatico.BienInformaticoId = bieninformatico.BienInformaticoId.Trim();
                                db.BienInformaticoes.Add(bieninformatico);
                                db.SaveChanges();

                                var cargoN = (from m in db.Cargoes
                                          where m.CargoId == bieninformatico.CargoId
                                          select m).ToList().FirstOrDefault();

                                //var obs = "Cargo involucrado en movimiento. " + cargoN.cdes.Replace('.', ' ') + ", " + cargoN.empleados.Replace('.', ' ') + ".";
                                var obs = "";
                                if (cargoN != null)
                                    obs = "Cargo involucrado en movimiento. " + cargoN.cdes.Replace('.', ' ') + ", " + cargoN.empleados.Replace('.', ' ') + ". ";
                                else
                                    obs = "Cargo involucrado en movimiento: se dejó vacío. ";
                                // Carga Movimiento
                                creacionMovimiento("Entrada", obs, bieninformatico.cubf, bieninformatico.localidad_id, 
                                                    bieninformatico.EstadoId, bieninformatico.BienInformaticoId);

                                //--------------------------------  Envio de Correo  ------------------------------//
                                var msnCorreo = "";
								//Obtención del nombre de la Localidad
                                var localidad = (from m in db1.LOCALIDAD
                                                 where m.localidad_id == bieninformatico.localidad_id
                                                 select m.localidad_nombre).ToList();
												 
								//Obtención del nombre del cargo
                                var cargo = (from c in db.Cargoes
                                             where c.CargoId == bieninformatico.CargoId
                                             select c.cdes).ToList();

                                //Obtención de la marca modelo
                                var marcaModelo = (from c in db.MarcaModeloes
                                             where c.MarcaModeloId == bieninformatico.MarcaModeloId
                                             select c.ncob.cnom).ToList();

								//Creación de los Datos del correo
                                var subjectSend = "Coordinación de Bienes Informáticos. " + subject;
                                var bodySend = " el traslado del Bien Informático de tipo " + marcaModelo.FirstOrDefault() + ", con serial '" + bieninformatico.BienInformaticoId +
                                                "' a la localidad " + localidad.FirstOrDefault() + ", para ser asignado al cargo "
                                                + cargo.FirstOrDefault() + ". <br /><br />" + body;
								
								//Busqueda de los correos destinatorios

                                var cc = (from m in db.ControlCorreos
                                          where m.CausaMovimientoId == bieninformatico.EstadoId
                                          select m.ccor).First();
                                if (email != String.Empty && subject != String.Empty && body != String.Empty) envioCorreo = true;
                                try
                                {
									//Envio de correo
                                    sendEmail(cc, subjectSend, bodySend, true);
                                    if (envioCorreo) sendEmail(email, subjectSend, bodySend, true);
                                    msnCorreo = "Se envió el correo satisfactoriamente";
                                }
                                catch (Exception)
                                {
                                    msnCorreo = "No se pudo enviar el correo debido a problemas con el servidor";
                                }
                                //--------------------------------  FIN Envio de Correo  ------------------------------//

                                return RedirectToAction("PreviewAdquision", new { id = bieninformatico.BienInformaticoId, msnCorreo = msnCorreo });
                            }
                        }
                        else
                            ViewBag.Fail = "Error en los rangos de las fechas.";
                    }
                    else
                        ViewBag.FailCorreo = "Debe Rellenar Correo";
                }
                else
                    ViewBag.FailSerial = "El serial ya existe.";
            }
            else
                ViewBag.FailAnexo = "El tipo de BI arrendado requiere el número de anexo y etiqueta.";

            /*correo*/
            ViewBag.email = email;
            ViewBag.subject = subject;
            ViewBag.body = body;
            /*correo*/

			//Metodo POST Inicializar las variables con los valores de busqueda introducidos
            ViewBag.MarcaModeloId_Visible = MarcaModeloId_Visible;
            ViewBag.ceco_id_Visible = ceco_id_Visible;
            ViewBag.CargoId_Visible = CargoId_Visible;
            ViewBag.localidad_id_Visible = localidad_id_Visible;

            ViewBag.PadreId = bieninformatico.PadreId;
            ViewBag.ceco_id = bieninformatico.ceco_id;
            ViewBag.localidad_id = bieninformatico.localidad_id;

            ViewBag.EstadoId = new SelectList(db.Estadoes, "EstadoId", "cnom", bieninformatico.EstadoId);
            ViewBag.TipoBienId = new SelectList(db.TipoBiens, "TipoBienId", "cnom", bieninformatico.TipoBienId);
            ViewBag.SociedadId = new SelectList(db.Sociedads, "SociedadId", "cscc", bieninformatico.SociedadId);
            ViewBag.DivisionId = new SelectList(db.Divisions, "DivisionId", "cper", bieninformatico.DivisionId);
            ViewBag.CargoId = bieninformatico.CargoId;
            ViewBag.nombre = nombre;
            ViewBag.MarcaModeloId = bieninformatico.MarcaModeloId;

            return View(bieninformatico);
        }

        //***********************************************************************************//
        // Autor:  										                     				*//
        //***********************************************************************************//
        // PreviewAdquision()	Acceso solo ADMINISTRADOR									*//
        // Acción que devuelve la vista del preview de la asignación o el resguardo de 		*//
        // de Bien Informático nuevo adquirido en un nuevo contrato							*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	id: identificador del BI que se desea ver el preview 						*//
        // •	msnCorreo: mensaje que indica si se logró enviar el correo electrónico o  no*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve el preview de la adquisición realizada.				*//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult PreviewAdquision(string id, string msnCorreo)
        {
            BienInformatico bieninformatico = db.BienInformaticoes.Find(id);
			
			//Busqueda del nombre de la localidad
            var localidad = from m in db1.LOCALIDAD
                            where m.localidad_id == bieninformatico.localidad_id
                            select m.localidad_nombre;

            ViewBag.localidad_id = localidad;
            ViewBag.msnCorreo = msnCorreo;

            return View(bieninformatico);
        }

        //***********************************************************************************//
        // Autor:  										                    				*//
        //***********************************************************************************//
        // PreviewDesincorporacion()	Acceso solo ADMINISTRADOR							*//
        // Acción que devuelve la vista del preview de la desincorporación realizada	 	*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	id: identificador del BI que se desea ver el preview 						*//
        // •	msnCorreo: mensaje que indica si se logró enviar el correo electrónico o  no*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve el preview de la desincorporación realizada.			*//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult PreviewDesincorporacion(string id, string msnCorreo)
        {
            BienInformatico bieninformatico = db.BienInformaticoes.Find(id);

			//Busqueda del nombre del Ceco
            var ceco = from m in db1.CECO
                       where m.ceco_id == bieninformatico.ceco_id
                       select m.ceco_descripcion;
            ViewBag.ceco_id = ceco;

			//Busqueda del nombre de la Localidad
            var localidad = from m in db1.LOCALIDAD
                            where m.localidad_id == bieninformatico.localidad_id
                            select m.localidad_nombre;
            ViewBag.localidad_id = localidad;
            ViewBag.msnCorreo = msnCorreo;

            return View(bieninformatico);
        }

        //***********************************************************************************//
        // Autor:  										     	                			*//
        //***********************************************************************************//
        // Edit()	Acceso solo ADMINISTRADOR												*//
        // Acción que devuelve la vista que permite editar un BI especificado. Método GET.	*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	id: identificador del BI que se desea editar.								*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve la plantilla para editar un BI.						*//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult Edit(string id)
        {
            BienInformatico bieninformatico = db.BienInformaticoes.Find(id);
            
			//Metodo GET Inicializar las variables con los valores predeterminados
            ViewBag.nombre = (from m in db.Cargoes
                              where m.CargoId == bieninformatico.CargoId
                              select m.empleados).FirstOrDefault();
            ViewBag.PadreId = bieninformatico.PadreId;
            ViewBag.ceco_id = bieninformatico.ceco_id;
            ViewBag.localidad_id = bieninformatico.localidad_id;

            if(bieninformatico.CargoId == null)
                ViewBag.CargoId_Visible = "";
            else
                ViewBag.CargoId_Visible = bieninformatico.ncar.cdes;

            ViewBag.MarcaModeloId_Visible = bieninformatico.nmym.cmod;
            ViewBag.ceco_id_Visible = (from m in db1.CECO
                                       where m.ceco_id == bieninformatico.ceco_id
                                       select m.ceco_descripcion).FirstOrDefault();
            ViewBag.localidad_id_Visible = (from m in db1.LOCALIDAD
                                       where m.localidad_id == bieninformatico.localidad_id
                                       select m.localidad_nombre).FirstOrDefault();

            ViewBag.EstadoId = new SelectList(db.Estadoes, "EstadoId", "cnom", bieninformatico.EstadoId);
            ViewBag.TipoBienId = new SelectList(db.TipoBiens, "TipoBienId", "cnom", bieninformatico.TipoBienId);
            ViewBag.SociedadId = new SelectList(db.Sociedads, "SociedadId", "cscc", bieninformatico.SociedadId);
            ViewBag.DivisionId = new SelectList(db.Divisions, "DivisionId", "cper", bieninformatico.DivisionId);
            ViewBag.CargoId = bieninformatico.CargoId;
            ViewBag.MarcaModeloId = bieninformatico.MarcaModeloId;

            return View(bieninformatico);
        }

        //***********************************************************************************//
        // Autor:  									                	     				*//
        //***********************************************************************************//
        // Edit()	Acceso solo ADMINISTRADOR												*//
        // Acción que devuelve la vista para Editar un BI nuevo. Método POST.				*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	bieninformatico: dato de tipo modelo, que representa un bien informático, 	*//
        //		este es requerido para verificar que los datos suministrados son correctos, *// 
        //		para así Editar o enviar un mensaje de error en la aplicación.				*//
        // •	Nombre: nombre del responsable del bien informático.						*//	
        // •	Parametros con sufijo Visible: String utilizado para el manejo del 			*//
        // 		autocompletado de campos. 													*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve el BI editado.										*//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        [HttpPost]
        public ActionResult Edit(BienInformatico bieninformatico, 
                    string nombre, string MarcaModeloId_Visible, 
                    string ceco_id_Visible, string CargoId_Visible, 
                    string localidad_id_Visible)
        {

            var tipoMov = "";
            var causaMov = 0;
            var valid = false;
			
			//Verificación de correctitud en los rangos de fecha
            if (bieninformatico.diga > bieninformatico.dfga) valid = false;
            else
            {
                valid = true;
                ViewBag.Fail = "";
            }
			
            if (valid)
            {
                if (ModelState.IsValid)//Verificaciòn Modelo
                {

                    db.Entry(bieninformatico).State = EntityState.Modified;
                    db.SaveChanges();

					// INICIO Movimiento
                    if (bieninformatico.EstadoId == 1)
                    {
                        tipoMov = "Entrada";
                        causaMov = 1;
                    }
                    else if (bieninformatico.EstadoId == 2)
                    {
                        tipoMov = "Entrada";
                        causaMov = 2;
                    }
                    else if (bieninformatico.EstadoId == 3)
                    {
                        tipoMov = "Salida";
                        causaMov = 3;
                    }
                    else if (bieninformatico.EstadoId == 4)
                    {
                        tipoMov = "Entrada";
                        causaMov = 4;
                    }
                    else if (bieninformatico.EstadoId == 5)
                    {
                        tipoMov = "Salida";
                        causaMov = 5;
                    }
                    else if (bieninformatico.EstadoId == 6)
                    {
                        tipoMov = "Salida";
                        causaMov = 6;
                    }

                    var cargoN = (from m in db.Cargoes
                                  where m.CargoId == bieninformatico.CargoId
                                  select m).ToList().FirstOrDefault();
                    
                    var obs = "";
                    if (cargoN != null)
                        obs = "Cargo involucrado en movimiento. " + cargoN.cdes.Replace('.', ' ') + ", " + cargoN.empleados.Replace('.', ' ') + ". ";
                    else
                        obs = "Cargo involucrado en movimiento: se dejó vacío. ";

                    // Carga Movimiento
                    creacionMovimiento(tipoMov, obs + "Movimiento realizado por edición del Bien Informático", 
                                    bieninformatico.cubf, bieninformatico.localidad_id, causaMov, 
                                    bieninformatico.BienInformaticoId);
					

                    return RedirectToAction("SearchIndex");
                }
            }
            else
                ViewBag.Fail = "Error en los rangos de las fechas.";

			//Método POST Inicializar las variables con los valores de busqueda introducidos
            ViewBag.MarcaModeloId_Visible = MarcaModeloId_Visible;
            ViewBag.ceco_id_Visible = ceco_id_Visible;
            ViewBag.CargoId_Visible = CargoId_Visible;
            ViewBag.localidad_id_Visible = localidad_id_Visible;

            ViewBag.PadreId = bieninformatico.PadreId;
            ViewBag.ceco_id = bieninformatico.ceco_id;
            ViewBag.localidad_id = bieninformatico.localidad_id;

            ViewBag.EstadoId = new SelectList(db.Estadoes, "EstadoId", "cnom", bieninformatico.EstadoId);
            ViewBag.TipoBienId = new SelectList(db.TipoBiens, "TipoBienId", "cnom", bieninformatico.TipoBienId);
            ViewBag.SociedadId = new SelectList(db.Sociedads, "SociedadId", "cscc", bieninformatico.SociedadId);
            ViewBag.DivisionId = new SelectList(db.Divisions, "DivisionId", "cper", bieninformatico.DivisionId);
            ViewBag.CargoId = bieninformatico.CargoId;
			ViewBag.nombre = nombre;
            ViewBag.MarcaModeloId = bieninformatico.MarcaModeloId;

            return View(bieninformatico);
        }

        //***********************************************************************************//
        // Autor:  										                    				*//
        //***********************************************************************************//
        // ResguardoR()	Acceso solo ADMINISTRADOR											*//
        // Acción que devuelve la vista para resguardar un BI existente en la empresa. 		*//
        // Método GET.																		*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	id: identificador del BI que se desea resguardar.							*//
        // •	TipoRes: tipo de resguardo que se está manejando, puede ser básico 			*//
        //		TipoRes = 2 o revisión TipoRes = 6.											*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve la plantilla para resguardar un BI.					*//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult ResguardoR(string id, int tipoRes)
        {
            BienInformatico bieninformatico = db.BienInformaticoes.Find(id);

            bieninformatico.cubf = string.Empty;
			//Busqueda del nombre de Usuario
            ViewBag.nombre = (from m in db.Cargoes
                              where m.CargoId == bieninformatico.CargoId
                              select m.empleados).FirstOrDefault();
			
			//Metodo GET Inicializar las variables con los valores predeterminados
            ViewBag.PadreId = new SelectList(db.BienInformaticoes, "BienInformaticoId", "BienInformaticoId", bieninformatico.PadreId);
            ViewBag.ceco_id = new SelectList(db1.CECO, "ceco_id", "ceco_descripcion", "7280600000");
            ViewBag.localidad_id = new SelectList(db1.LOCALIDAD, "localidad_id", "localidad_nombre", "0002");

            ViewBag.CecoIdV = new SelectList(db1.CECO, "ceco_id", "ceco_descripcion", bieninformatico.ceco_id);
            ViewBag.LocalidadIdV = new SelectList(db1.LOCALIDAD, "localidad_id", "localidad_nombre", bieninformatico.localidad_id);
            ViewBag.EstadoIdV = new SelectList(db.Estadoes, "EstadoId", "cnom", bieninformatico.EstadoId);
            ViewBag.CargoIdV = new SelectList(db.Cargoes, "CargoId", "cdes", bieninformatico.CargoId);
            ViewBag.Correo = (from m in db.Cargoes where m.CargoId == bieninformatico.CargoId select m.correo).FirstOrDefault();

            ViewBag.ClaseIdV = bieninformatico.nmym.ncob.cnom;

            ViewBag.EstadoId = new SelectList(db.Estadoes, "EstadoId", "cnom", tipoRes);
            ViewBag.TipoBienId = new SelectList(db.TipoBiens, "TipoBienId", "cnom", bieninformatico.TipoBienId);
            ViewBag.SociedadId = new SelectList(db.Sociedads, "SociedadId", "cscc", bieninformatico.SociedadId);
            ViewBag.DivisionId = new SelectList(db.Divisions, "DivisionId", "cper", "0000");
            ViewBag.CargoId = new SelectList(db.Cargoes, "CargoId", "cdes", "DEPOSITO");
            ViewBag.MarcaModeloId = new SelectList(db.MarcaModeloes, "MarcaModeloId", "cmod", bieninformatico.MarcaModeloId);
            return View(bieninformatico);
        }

        //***********************************************************************************//
        // Autor:  										                     				*//
        //***********************************************************************************//
        // ResguardoR()	Acceso solo ADMINISTRADOR											*//
        // Acción que devuelve la vista para resguardar un BI nuevo. Método POST.			*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	bieninformatico: dato de tipo modelo, que representa un bien informático, 	*// 
        //		este es requerido para verificar que los datos suministrados son correctos, *//
        //		para así resguardar o enviar un mensaje de error en la aplicación. 			*//
        // •	Nombre: nombre del responsable del bien informático.						*//
        // •	Parámetros con sufijo IdV: caracteres que permiten visualizar en la vista 	*//
        //		los datos antiguos que poseía el BI.										*//
        // •	Email: correo que va a anexar a la lista de destinatarios del correo 		*//
        //		electrónico.																*//
        // •	EmailSuper: correo que va a anexar a la lista de destinatarios del correo 	*//
        //		electrónico.																*//
        // •	Subject: caracteres que se van a anexar al asunto original del correo 		*//
        //		electrónico.																*// 
        // •	Body: caracteres que se van a anexar al cuerpo original del correo 			*//
        //		electrónico. 																*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve el BI asignado.										*//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        [HttpPost]
        public ActionResult ResguardoR(BienInformatico bieninformatico, string nombre, string LocalidadIdV, string CecoIdV, string CargoIdV, int? EstadoIdV, string ClaseIdV,/*correos*/string email, string emailSuper, string subject, string body/*correos*/)
        {
			//Verificación de llenado de correos
            ModelState.Remove("ClaseIdV");
            var envioCorreo = false;
            if (email != string.Empty)
            {
                if (emailSuper != string.Empty)
                {
                    if (ModelState.IsValid)//Verificación de modelo
                    {
                        var bieninformaticoP = (from m in db.BienInformaticoes
                                                where m.PadreId == bieninformatico.BienInformaticoId
                                                select m.BienInformaticoId).ToList();

                        bieninformatico.PadreId = null;
                        db.Entry(bieninformatico).State = EntityState.Modified;
                        db.SaveChanges();

                        var cargoN = (from m in db.Cargoes
                                      where m.CargoId == bieninformatico.CargoId
                                      select m).ToList().FirstOrDefault();

                        var obs = "Cargo involucrado en movimiento. " + cargoN.cdes.Replace('.', ' ') + ", " + cargoN.empleados.Replace('.', ' ') + "."; 

                        // Carga Movimiento
                        creacionMovimiento("Salida", obs, bieninformatico.cubf, bieninformatico.localidad_id, 
                                            bieninformatico.EstadoId, bieninformatico.BienInformaticoId);

                        //--------------------------------  Envio de Correo  ------------------------------//
                        var msnCorreo = "";
						
						//Busqueda del nombre de la Localidad
                        var localidad = (from m in db1.LOCALIDAD
                                         where m.localidad_id == LocalidadIdV
                                         select m.localidad_nombre).ToList();
						//Busqueda del nombre del Cargo
                        var cargo = (from c in db.Cargoes
                                     where c.CargoId == CargoIdV
                                     select c.cdes).ToList();
									
                        //Obtención de la marca modelo
                        var marcaModelo = (from c in db.MarcaModeloes
                                           where c.MarcaModeloId == bieninformatico.MarcaModeloId
                                           select c.ncob.cnom).ToList();

						//Creación de los Datos del correo
                        var emailSend = email + "," + emailSuper;
                        var subjectSend = "Coordinación de Bienes Informáticos. " + subject;
                        var bodySend = " el Resguardo del Bien Informático de tipo " + marcaModelo.FirstOrDefault() + ", con serial '" + bieninformatico.BienInformaticoId +
                                       "' a Depósito en Centro Monaca, que estaba en la localidad" + localidad.FirstOrDefault() + 
                                       ", asignado al cargo " + cargo.FirstOrDefault() + ". <br /><br />" + body;

						//Busqueda de los correos destinatorios
                        var cc = (from m in db.ControlCorreos
                                  where m.CausaMovimientoId == bieninformatico.EstadoId
                                  select m.ccor).First();

                        if (email != String.Empty && subject != String.Empty && body != String.Empty) envioCorreo = true;
                        try
                        {
							//Envio de correo
                            sendEmail(cc, subjectSend, bodySend, true);
                            if (envioCorreo) sendEmail(emailSend, subjectSend, bodySend, true);
                            msnCorreo = "Se envió el correo satisfactoriamente";
                        }
                        catch (Exception)
                        {
                            msnCorreo = "No se pudo enviar el correo debido a problemas con el servidor";
                        }
                        //--------------------------------  FIN Envio de Correo  ------------------------------//

                        if (bieninformaticoP.Count == 0)
                        {
                            return RedirectToAction("PreviewAdquision", new { id = bieninformatico.BienInformaticoId, msnCorreo = msnCorreo });
                        }
                        else
                        {
                            return RedirectToAction("RetiroResguardoPadre", new { derp = "derp", idRes = bieninformatico.BienInformaticoId, msnCorreo = msnCorreo }/*"RetiroResguardo"*/);
                        }
                    }
                }
                else
                    ViewBag.FailCorreoS = "Debe Rellenar Correo del Supervisor";

            }
            else
                ViewBag.FailCorreoU = "Debe Rellenar Correo de Usuario";

            /*correo*/
            ViewBag.email = email;
            ViewBag.emailSuper = emailSuper;
            ViewBag.subject = subject;
            ViewBag.body = body;
            /*correo*/

			//Metodo POST Inicializar las variables con los valores de busqueda introducidos
            ViewBag.PadreId = new SelectList(db.BienInformaticoes, "BienInformaticoId", "BienInformaticoId", bieninformatico.PadreId);
            ViewBag.ceco_id = new SelectList(db1.CECO, "ceco_id", "ceco_descripcion", bieninformatico.ceco_id);
            ViewBag.localidad_id = new SelectList(db1.LOCALIDAD, "localidad_id", "localidad_nombre", "0002");

            ViewBag.CecoIdV = new SelectList(db1.CECO, "ceco_id", "ceco_descripcion", CecoIdV);
            ViewBag.LocalidadIdV = new SelectList(db1.LOCALIDAD, "localidad_id", "localidad_nombre", LocalidadIdV);
            ViewBag.EstadoIdV = new SelectList(db.Estadoes, "EstadoId", "cnom", EstadoIdV);
            ViewBag.CargoIdV = new SelectList(db.Cargoes, "CargoId", "cdes", CargoIdV);
            ViewBag.ClaseIdV = ClaseIdV;

            ViewBag.Correo = (from m in db.Cargoes where m.CargoId == bieninformatico.CargoId select m.correo).First();
            ViewBag.nombre = nombre;
            ViewBag.EstadoId = new SelectList(db.Estadoes, "EstadoId", "cnom", bieninformatico.EstadoId);
            ViewBag.TipoBienId = new SelectList(db.TipoBiens, "TipoBienId", "cnom", bieninformatico.TipoBienId);
            ViewBag.SociedadId = new SelectList(db.Sociedads, "SociedadId", "cscc", bieninformatico.SociedadId);
            ViewBag.DivisionId = new SelectList(db.Divisions, "DivisionId", "cper", bieninformatico.DivisionId);
            ViewBag.CargoId = new SelectList(db.Cargoes, "CargoId", "cdes", "DEPOSITO");
            ViewBag.MarcaModeloId = new SelectList(db.MarcaModeloes, "MarcaModeloId", "cmod", bieninformatico.MarcaModeloId);
            return View(bieninformatico);
        }

        //***********************************************************************************//
        // Autor:  								                		     				*//
        //***********************************************************************************//
        // RetiroResguardoPadre()	Acceso solo ADMINISTRADOR								*//
        // Acción que devuelve la vista para asignar Padre los BI que quedaron huerfanos 	*//
        // luego del resguardo si es necesario. Método GET.									*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	idRes: identificador del BI que se desea asignar un IdPadre.				*//
        // •	msnCorreo: mensaje que indica si se logró enviar el correo electrónico 		*//
        // •	error: mensaje que indica si ocurrió un error en la asignación del IdPadre.	*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve la plantilla para asignar un padre al BI.			*//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult RetiroResguardoPadre(string derp, string idRes, string msnCorreo, string Error)
        {
            var seriales = "Los hijos a modificar son: ";
			
			//Busqueda de los BI cuyo Padre fue resguardado
            var bieninformaticoP = (from m in db.BienInformaticoes
                                    where m.PadreId == idRes
                                    select m.BienInformaticoId).ToList();

			//Conjinto de hijos que quedaron sin padre
            foreach (var BienInformaticoIdAux in bieninformaticoP)
            {
                BienInformatico BienModf = db.BienInformaticoes.Find(BienInformaticoIdAux);
                seriales = seriales + BienModf.BienInformaticoId + ", ";
            }
            seriales = seriales + " si no Asigna un Padre el campo PadreId quedará vacío";

			//Metodo GET Inicializar las variables con los valores de busqueda introducidos
            ViewBag.msnCorreo = msnCorreo;
            ViewBag.Error = Error;
            ViewBag.seriales = seriales;
            ViewBag.idRes = idRes;
            ViewBag.PadreId = "";

            return View();
        }

        //***********************************************************************************//
        // Autor:  										                     				*//
        //***********************************************************************************//
        // RetiroResguardoPadre()	Acceso solo ADMINISTRADOR								*//
        // Acción que devuelve la vista para asignar Padre los BI que quedaron huerfanos 	*//
        // luego del resguardo si es necesario. Método POST.								*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	submitButton1: indica si se selecciono el botón con la opción para asignar 	*//
        //		un nuevo IdPadre. 															*// 
        // •	submitButton2: indica si se selecciono el botón con la opción de no asignar *//
        //		un nuevo IdPadre. 															*//
        // •	error: mensaje que indica si ocurrió un erro en la asignación del IdPadre. 	*//
        // •	idRes: identificador del BI que se desea asignar un IdPadre.				*//
        // •	PadreId: identificador del BI que va a asignar como IdPadre.				*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve la asignación de un padre al BI.						*//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        [HttpPost]
        [ValidateAntiForgeryToken(Salt = "PostData")]
        public ActionResult RetiroResguardoPadre(string submitButton1, string submitButton2, string Error, string idRes, string PadreId)
        {
			//Selección del botón para asignar un Padre
            if (submitButton2 == null)
            {
                if (PadreId == String.Empty)
                {

                    ViewBag.Error = "Debe seleccionar un Padre para Asignar";
                    return RedirectToAction("RetiroResguardoPadre", new { idRes = idRes, Error = ViewBag.Error });

                }
                var bieninformaticoP = (from m in db.BienInformaticoes
                                        where m.PadreId == idRes
                                        select m.BienInformaticoId).ToList();

                var bienInformaticoRes = (from m in db.BienInformaticoes
                                          where m.BienInformaticoId == idRes
                                          select m.nmym.ncob.cnom).FirstOrDefault();

                var bienInformaticoNuevo = (from m in db.BienInformaticoes
                                            where m.BienInformaticoId == PadreId
                                            select m.nmym.ncob.cnom).FirstOrDefault();

                if (bienInformaticoRes == bienInformaticoNuevo)
                {
                    if (bieninformaticoP.Count != 0)
                    {
                        foreach (var BienInformaticoIdAux in bieninformaticoP)
                        {
                            if (PadreId == BienInformaticoIdAux)
                            {
                                ViewBag.Error = "No puede seleccionar ese PadreID porque se Autoreferencia";
                                return RedirectToAction("RetiroResguardoPadre", new { idRes = idRes, Error = ViewBag.Error });
                            }
                            else if (PadreId == idRes)
                            {
                                ViewBag.Error = "No puede seleccionar ese PadreID porque es el Bien Informático resguardado anteriormente";
                                return RedirectToAction("RetiroResguardoPadre", new { idRes = idRes, Error = ViewBag.Error });
                            }
							
                            BienInformatico BienModf = db.BienInformaticoes.Find(BienInformaticoIdAux);
                            BienModf.PadreId = PadreId;
                            db.Entry(BienModf).State = EntityState.Modified;
                        }
                    }
                }
                else
                {
                    ViewBag.Error = "No puede seleccionar ese PadreID porque no tiene la misma Clase de Objeto del Bien Informático resguardado anteriormente";
                    return RedirectToAction("RetiroResguardoPadre", new { idRes = idRes, Error = ViewBag.Error });
                }

            }
            else if (submitButton1 == null)//Selección del botón para NO asignar un Padre
            {
                var bieninformaticoP = (from m in db.BienInformaticoes
                                        where m.PadreId == idRes
                                        select m.BienInformaticoId).ToList();

                if (bieninformaticoP.Count != 0)
                {
                    foreach (var BienInformaticoIdAux in bieninformaticoP)
                    {
                        BienInformatico BienModf = db.BienInformaticoes.Find(BienInformaticoIdAux);
                        BienModf.PadreId = null;

                        db.Entry(BienModf).State = EntityState.Modified;
                    }
                }
            }
            db.SaveChanges();
            return RedirectToAction("PreviewAdquision", new { id = idRes });
        }

        //***********************************************************************************//
        // Autor:  										                     				*//
        //***********************************************************************************//
        // DesincorporacionR()	Acceso solo ADMINISTRADOR									*//
        // Acción que devuelve la vista para desincorporar un BI. Método GET.				*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	id: identificador del BI que se desea desincorporar. 						*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve la plantilla para desincorporar un BI.				*//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult DesincorporacionR(string id)
        {

            BienInformatico bieninformatico = db.BienInformaticoes.Find(id);
            bieninformatico.cubf = string.Empty;
            bieninformatico.dfde = DateTime.Now.Date;
	
			//Metodo GET Inicializar las variables con los valores predeterminados
            ViewBag.PadreId = new SelectList(db.BienInformaticoes, "BienInformaticoId", "BienInformaticoId", bieninformatico.PadreId);
            ViewBag.ceco_id = new SelectList(db1.CECO, "ceco_id", "ceco_descripcion", bieninformatico.ceco_id);
            ViewBag.localidad_id = new SelectList(db1.LOCALIDAD, "localidad_id", "localidad_nombre", "0002");

            ViewBag.LocalidadIdV = new SelectList(db1.LOCALIDAD, "localidad_id", "localidad_nombre", bieninformatico.localidad_id);
            ViewBag.EstadoIdV = new SelectList(db.Estadoes, "EstadoId", "cnom", bieninformatico.EstadoId);
            ViewBag.ClaseIdV = bieninformatico.nmym.ncob.cnom;

            ViewBag.EstadoId = new SelectList(db.Estadoes, "EstadoId", "cnom", 5);
            ViewBag.TipoBienId = new SelectList(db.TipoBiens, "TipoBienId", "cnom", bieninformatico.TipoBienId);
            ViewBag.SociedadId = new SelectList(db.Sociedads, "SociedadId", "cscc", bieninformatico.SociedadId);
            ViewBag.DivisionId = new SelectList(db.Divisions, "DivisionId", "cper", bieninformatico.DivisionId);
            ViewBag.CargoId = new SelectList(db.Cargoes, "CargoId", "cdes", "DEPOSITO");
            ViewBag.MarcaModeloId = new SelectList(db.MarcaModeloes, "MarcaModeloId", "cmod", bieninformatico.MarcaModeloId);

            return View(bieninformatico);
        }

        //***********************************************************************************//
        // Autor:  										                       				*//
        //***********************************************************************************//
        // DesincorporacionR()	Acceso solo ADMINISTRADOR									*//
        // Acción que devuelve la vista para desincorporar un BI. Método POST.				*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	bieninformatico: dato de tipo modelo, que representa un bien informático, 	*//
        //		este es requerido para verificar que los datos suministrados son correctos, *//
        //		para así desincorporar o enviar un mensaje de error en la aplicación. 		*//
        // •	Parámetros con sufijo IdV: caracteres que permiten visualizar en la vista 	*//
        //		los datos antiguos que poseía el BI. 										*//
        // •	Email: correo que va a anexar a la lista de destinatarios del correo 		*//
        //		electrónico.																*//
        // •	Subject: caracteres que se van a anexar al asunto original del correo 		*//
        //		electrónico. 																*//
        // •	Body: caracteres que se van a anexar al cuerpo original del correo 			*//
        //		electrónico. 																*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve la desincorporación de un BI.						*//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        [HttpPost]
        public ActionResult DesincorporacionR(BienInformatico bieninformatico, string LocalidadIdV, string CargoIdV, int? EstadoIdV, string ClaseIdV, /*correo*/string subject, string body /*correos*/)
        {

            ModelState.Remove("ClaseIdV");
            var seriales = "El idPadre los Bienes Informáticos hijos, ";

            if (ModelState.IsValid)//Verificación del modelo
            {
				//Verificación si el BI es padre
                var bieninformaticoP = (from m in db.BienInformaticoes
                                        where m.PadreId == bieninformatico.BienInformaticoId
                                        select m.BienInformaticoId).ToList();
				//Colocación del valor Null a los hijos en su IdPadre
                if (bieninformaticoP != null)
                {
                    foreach (var BienInformaticoIdAux in bieninformaticoP)
                    {
                        BienInformatico BienModf = db.BienInformaticoes.Find(BienInformaticoIdAux);
                        BienModf.PadreId = null;
                        seriales = seriales + BienModf.BienInformaticoId + ", ";
                        db.Entry(BienModf).State = EntityState.Modified;
                    }

                    seriales = seriales + " quedaron con el Null";
                }
                else
                {
                    seriales = string.Empty;
                }

                bieninformatico.PadreId = null;
                db.Entry(bieninformatico).State = EntityState.Modified;
                db.SaveChanges();

                //----------------------------  Cargar Cargo Reponsable Movimiento  ------------------------------//

                //Obtener ultimo movimiento para un BI
                var lastMovBI = (from m in db.Movimientoes
                                 where m.BienInformaticoId == bieninformatico.BienInformaticoId
                                 select m.cobs).ToList().LastOrDefault();

                string [] MovCargoSplit = {};
                if (lastMovBI != null)
                    MovCargoSplit = lastMovBI.Split('.');

                var lastLocBI = (from m in db1.LOCALIDAD
                                where m.localidad_id == bieninformatico.localidad_id
                                select m.localidad_nombre).ToList().FirstOrDefault();

                //----------------------------  FIN Cargar Cargo Reponsable Movimiento  ------------------------------//
                var cargoN = (from m in db.Cargoes
                              where m.CargoId == bieninformatico.CargoId
                              select m).ToList().FirstOrDefault();

                var obs = "Cargo involucrado en movimiento. " + cargoN.cdes.Replace('.', ' ') + ", " + cargoN.empleados.Replace('.', ' ') + "."; 
                // Carga Movimiento
                creacionMovimiento("Salida", obs, bieninformatico.cubf, bieninformatico.localidad_id, bieninformatico.EstadoId, bieninformatico.BienInformaticoId);
				
               
                //--------------------------------  Envio de Correo  ------------------------------//
                var msnCorreo = "";
                //Obtención de la marca modelo
                var marcaModelo = (from c in db.MarcaModeloes
                                   where c.MarcaModeloId == bieninformatico.MarcaModeloId
                                   select c.ncob.cnom).ToList();

				//Creación de los Datos del correo
                var subjectSend = "Coordinación de Bienes Informáticos. " + subject;
                var bodySend = "";
                if (MovCargoSplit.Count() != 0)
                {
                    bodySend = " la Desincorporación del Bien Informático de tipo " + marcaModelo.FirstOrDefault() +
                                ", con serial '" + bieninformatico.BienInformaticoId + "' que pertenecia a " + MovCargoSplit[1] +
                                " de la localidad " + lastLocBI + ". <br /><br />" + body;
                }
                else
                {
                    bodySend = " la Desincorporación del Bien Informático de tipo " + marcaModelo.FirstOrDefault() +
                            ", con serial '" + bieninformatico.BienInformaticoId + "' " + 
                            " de la localidad " + lastLocBI + ". <br /><br />" + body;
                }

				//Busqueda de los correos destinatorios
                string cc = (from m in db.ControlCorreos
                             where m.CausaMovimientoId == bieninformatico.EstadoId
                             select m.ccor).FirstOrDefault();

                try
                {
                    if (bieninformatico.TipoBienId == 1)
                    {
                        var splitCorreos = cc.Split(',');
                        cc = splitCorreos[0]; // Solo se permiter el primer caso ya que no se
                        // desea enviar correo a Activo Fijo
                    }

					//Envio de correo
                    sendEmail(cc, subjectSend, bodySend, true);
                    msnCorreo = "Se envió el correo satisfactoriamente";
                }
                catch (Exception)
                {
                    msnCorreo = "No se pudo enviar el correo debido a problemas con el servidor";
                }
                //--------------------------------  FIN Envio de Correo  ------------------------------//


                return RedirectToAction("PreviewDesincorporacion", new { id = bieninformatico.BienInformaticoId, msnCorreo = msnCorreo });
            }

            bieninformatico.dfde = DateTime.Now.Date;

			//Metodo POST Inicializar las variables con los valores de busqueda introducidos
            ViewBag.PadreId = new SelectList(db.BienInformaticoes, "BienInformaticoId", "BienInformaticoId", bieninformatico.PadreId);
            ViewBag.ceco_id = new SelectList(db1.CECO, "ceco_id", "ceco_descripcion", bieninformatico.ceco_id);
            ViewBag.localidad_id = new SelectList(db1.LOCALIDAD, "localidad_id", "localidad_nombre", "0002");

            ViewBag.LocalidadIdV = new SelectList(db1.LOCALIDAD, "localidad_id", "localidad_nombre", LocalidadIdV);
            ViewBag.EstadoIdV = new SelectList(db.Estadoes, "EstadoId", "cnom", EstadoIdV);
            ViewBag.ClaseIdV = ClaseIdV;

            ViewBag.EstadoId = new SelectList(db.Estadoes, "EstadoId", "cnom", 5);
            ViewBag.TipoBienId = new SelectList(db.TipoBiens, "TipoBienId", "cnom", bieninformatico.TipoBienId);
            ViewBag.SociedadId = new SelectList(db.Sociedads, "SociedadId", "cscc", bieninformatico.SociedadId);
            ViewBag.DivisionId = new SelectList(db.Divisions, "DivisionId", "cper", bieninformatico.DivisionId);
            ViewBag.CargoId = new SelectList(db.Cargoes, "CargoId", "cdes", "DEPOSITO");
            ViewBag.MarcaModeloId = new SelectList(db.MarcaModeloes, "MarcaModeloId", "cmod", bieninformatico.MarcaModeloId);

            return View(bieninformatico);
        }

        //***********************************************************************************//
        // Autor:  							                			     				*//
        //***********************************************************************************//
        // RetiroDesincorporacionAnexo() Acceso solo ADMINISTRADOR							*//
        // Acción que devuelve la vista para desincorporar un BI  existente en la empresa de*//
        // manera masiva.	 																*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	Bool: selección en una lista booleana de cuales BI de un anexo se desean 	*//
        // 		desincorporar.																*//
        // •	Anexo: anexo el cual se desea desincorporar.								*//
        // •	submitButton1: indica si se selecciono la opción para buscar un anexo.		*//
        // •	submitButton2: indica si se selecciono la opción para desincorporar un anexo*//
        // •	AnexoIgual: verifica si el anexo suministrado en el campo de filtrado es el *//
        //		mismo que aparece listado debajo. 											*//
        // •	Parámetros con prefijo search: caracteres por los cuales se va a filtrar la *//
        //		búsqueda.																	*//
        // •	Parámetros con prefijo current: caracteres que guarda al búsqueda anterior  *//
        //		para mantenerla																*//
        // •	Page: entero que denota el numero de pagina que se tiene en la lista de 	*//
        //		búsqueda, por defecto su valor es 1.										*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que posee todos los bienes informáticos listados deseados			*//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult RetiroDesincorporacionAnexo(bool[] select, string anexo, string submitButton1, string submitButton2, string AnexoIgual, string currentSerial, string searchSerial, int? page = 1)
        {
            var bi = db.BienInformaticoes.Include(b => b.nest).Include(b => b.ntib).Include(b => b.nsoc).Include(b => b.ndiv).Include(b => b.ncar).Include(b => b.nmym);

			//Metodo GET Inicializar las variables con los valores de busqueda introducidos
            if (Request.HttpMethod == "GET")
            {
                searchSerial = currentSerial;
                bi = bi.Where(m => m.BienInformaticoId == "000");
            }

			//Metodo POST Inicializar las variables con los valores de busqueda introducidos
            ViewBag.CurrentSerial = searchSerial;
            ViewBag.AnexoIgual = AnexoIgual;

            /*Fitrar*/
            if (submitButton2 == null)
            {

                //Filtrado de lista de Bienes Informáticos, solo Arrendados
                bi = bi.Where(s => s.TipoBienId == 1);

                //Filtrado de lista de Bienes Informáticos, no se listen desincorporados
                bi = bi.Where(s => s.EstadoId != 5);

                if (!String.IsNullOrEmpty(searchSerial))
                {
                    bi = bi.Where(s => s.nanf == searchSerial);
                }
				
				//Ordenar los BI del return
                bi = bi.OrderBy(x => x.nanf);

            }/*Desincorporar*/
            else if (submitButton1 == null)
            {
                if (searchSerial != string.Empty)
                {
					//Busqueda de los BI del anexo deseado
                    var bieninformaticoAnexo = (from m in db.BienInformaticoes
                                                where m.nanf == anexo && m.EstadoId != 5 && m.TipoBienId == 1
                                                select m.BienInformaticoId).ToList();
												
					//Desincorporación de los BI seleccionados
                    var i = 0;
                    foreach (var BienInformaticoIdAux in bieninformaticoAnexo)
                    {
                        if (select[i])//Verificación de los Checkbox deseados
                        {
                            BienInformatico BienModf = db.BienInformaticoes.Find(BienInformaticoIdAux);
                            var cargoN = (from m in db.Cargoes
                                          where m.CargoId == BienModf.CargoId
                                          select m).ToList().FirstOrDefault();
                            var obs = "Cargo involucrado en movimiento. " + cargoN.cdes.Replace('.', ' ') + ", " + cargoN.empleados.Replace('.', ' ') + ". "; 

                            BienModf.localidad_id = "0002";
                            BienModf.EstadoId = 5;
                            BienModf.CargoId = "DEPOSITO";
                            db.Entry(BienModf).State = EntityState.Modified;
                            db.SaveChanges();

                            // Carga Movimiento
                            creacionMovimiento("Salida", obs + "Desincorporación Masiva", "Fuera de la Empresa", "0002", 5, BienInformaticoIdAux);

                            i = i + 2;
                        }
                        else
                        {
                            i++;
                        }
                    }
                    return RedirectToAction("DesincorporacionConfirm", new { idAnex = searchSerial });
                }
                else
                {

                    //Filtrado de lista de Bienes Informáticos, solo Arrendados
                    bi = bi.Where(s => s.TipoBienId == 1);

                    if (!String.IsNullOrEmpty(searchSerial))
                    {
                        bi = bi.Where(s => s.nanf == searchSerial);
                    }

                    bi = bi.OrderBy(x => x.nanf);
                    ViewBag.Anexo = "Número de Anexo es requerido";
                }
            }
            return View(bi);
        }

        //***********************************************************************************//
        // Autor:  								                		     				*//
        //***********************************************************************************//
        // DesincorporacionConfirm()	Acceso solo ADMINISTRADOR							*//
        // Acción que devuelve la vista que lista los BI que han sido desincorporados del 	*//
        // anexo seleccionado.																*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	idAnex: identificador del anexo que se ve cuales BI se desincorporaron.		*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve la lista de los BI que se desincorporaron.			*//
        // _________________________________________________________________________________*//        
        [Authorize(Roles = "Admin")]
        public ActionResult DesincorporacionConfirm(string idAnex)
        {

            var bi = db.BienInformaticoes.Include(b => b.nest).Include(b => b.ntib).Include(b => b.nsoc).Include(b => b.ndiv).Include(b => b.ncar).Include(b => b.nmym);

            //Filtrado de lista de Bienes Informáticos, Anexo Desincorporado
            bi = bi.Where(s => s.nanf == idAnex);

            //Filtrado de lista de Bienes Informáticos, Desincorporados
            bi = bi.Where(s => s.EstadoId == 5);

            bi = bi.OrderBy(x => x.BienInformaticoId);

            return View(bi);

        }

        //***********************************************************************************//
        // Autor:  									                	     				*//
        //***********************************************************************************//
        // ImpresionEtiquetaAnexo() Acceso solo ADMINISTRADOR								*//
        // Acción que devuelve la vista para imprimir las etiquetas de un anexo o BI		*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	Parámetros con prefijo search: caracteres por los cuales se va a filtrar la *//
        //		búsqueda.																	*//
        // •	Parámetros con prefijo current: caracteres que guarda al búsqueda anterior  *//
        //		para mantenerla																*//
        // •	Page: entero que denota el numero de pagina que se tiene en la lista de 	*//
        //		búsqueda, por defecto su valor es 1.										*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que posee todos las etiquetas listadas deseadas					*//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult ImpresionEtiquetaAnexo(string CurrentAnexo, string SearchAnexo, string CurrentSerial, string SearchSerial, int? page = 1)
        {
            var bi = db.BienInformaticoes.Include(b => b.nest).Include(b => b.ntib).Include(b => b.nsoc).Include(b => b.ndiv).Include(b => b.ncar).Include(b => b.nmym);

			//Metodo GET Inicializar las variables con los valores de busqueda introducidos
            if (Request.HttpMethod == "GET")
            {
                SearchAnexo = CurrentAnexo;
                bi = bi.Where(m => m.BienInformaticoId == "000");
            }

			//Metodo POST Inicializar las variables con los valores de busqueda introducidos
            ViewBag.CurrentSerial = SearchSerial;
            ViewBag.CurrentAnexo = SearchAnexo;

            //Filtrado de lista de Bienes Informáticos, solo Arrendados
            bi = bi.Where(s => s.TipoBienId == 1);

            //Filtrado de lista de Bienes Informáticos, no se listen desincorporados
            bi = bi.Where(s => s.EstadoId != 5);

            //Fitrar
            if (!String.IsNullOrEmpty(SearchAnexo))
            {
                bi = bi.Where(s => s.nanf == SearchAnexo);
            }

            if (!String.IsNullOrEmpty(SearchSerial))
            {
                bi = bi.Where(s => s.BienInformaticoId.Contains(SearchSerial));
            }
			
			//Ordenar los BI del return
            bi = bi.OrderBy(x => x.nanf);
            return View(bi);
        }




        //***********************************************************************************//
        // Autor:  Adrian Di Puglia						                	     		    *//
        //***********************************************************************************//
        // ImpresionEtiqueta() Acceso solo ADMINISTRADOR							      	*//
        // Acción que devuelve la vista para imprimir las etiquetas de un BI		        *//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	Parámetros con prefijo search: caracteres por los cuales se va a filtrar la *//
        //		búsqueda.																	*//
        // •	Parámetros con prefijo current: caracteres que guarda al búsqueda anterior  *//
        //		para mantenerla																*//
        // •	Page: entero que denota el numero de pagina que se tiene en la lista de 	*//
        //		búsqueda, por defecto su valor es 1.										*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que posee todos las etiquetas listadas deseadas					*//
        // _________________________________________________________________________________*//
        //***********************************************************************************//
        //****                        INICIO  PROYECTO SIBI V.1.0                         ***//
        //****                             Adrian Di Puglia                               ***//
        //***********************************************************************************//
        [Authorize(Roles = "Admin")]
        public ActionResult ImpresionEtiqueta(string CurrentRes, string SearchRes, string CurrentSerial, string SearchSerial,
                                              string CurrentTipo, string SearchTipo, string CurrentEst, string SearchEst,
                                              string CurrentAct, string SearchAct, string CurrentClaseOjeto, string SearchClaseObjeto, int? page = 1)
        {
            var bi = db.BienInformaticoes.Include(b => b.nest).Include(b => b.ntib).Include(b => b.nsoc).Include(b => b.ndiv).Include(b => b.ncar).Include(b => b.nmym);

            //Metodo GET Inicializar las variables con los valores de busqueda introducidos
            if (Request.HttpMethod == "GET")
            {
                SearchRes = CurrentRes;
                SearchSerial = CurrentSerial;
                SearchTipo = CurrentTipo;
                SearchEst = CurrentEst;
                SearchAct = CurrentAct;
                SearchClaseObjeto = CurrentClaseOjeto;

                bi = bi.Where(m => m.BienInformaticoId == "000");
            }

            //Metodo POST Inicializar las variables con los valores de busqueda introducidos
            ViewBag.CurrentRes = SearchRes;
            ViewBag.CurrentSerial = SearchSerial;
            ViewBag.CurrentTipo = SearchTipo;
            ViewBag.CurrentEst = SearchEst;
            ViewBag.CurrentAct = SearchAct;
            ViewBag.CurrentClaseOjeto = SearchClaseObjeto;

            //Filtrado de lista de Bienes Informáticos, solo Arrendados
            //bi = bi.Where(s => s.TipoBienId == 1);

            //Filtrado de lista de Bienes Informáticos, no se listen desincorporados
            //bi = bi.Where(s => s.EstadoId != 5);

            //Fitrar
            if (!String.IsNullOrEmpty(SearchSerial))
            {
                bi = bi.Where(s => s.BienInformaticoId.Contains(SearchSerial));
            }

            if (!String.IsNullOrEmpty(SearchClaseObjeto))
            {
                bi = bi.Where(s => s.nmym.ncob.cnom.Contains(SearchClaseObjeto));
            }

            if (!String.IsNullOrEmpty(SearchEst))
            {
                bi = bi.Where(s => s.nest.cnom.Contains(SearchEst));
            }

            if (!String.IsNullOrEmpty(SearchTipo))
            {
                bi = bi.Where(s => s.ntib.cnom.Contains(SearchTipo));
            }

            if (!String.IsNullOrEmpty(SearchAct))
            {
                bi = bi.Where(s => s.nanf.Equals(SearchAct));
            }

            if (!String.IsNullOrEmpty(SearchRes))
            {
                bi = bi.Where(s => s.ncar.empleados.Contains(SearchRes));
            }

            //Ordenar los BI del return
            bi = bi.OrderBy(x => x.BienInformaticoId);
            return View(bi);
        }
        //***********************************************************************************//
        //****                          FIN  PROYECTO SIBI V.1.0                          ***//
        //***********************************************************************************//


        //***********************************************************************************//
        // Autor:  									                	     				*//
        //***********************************************************************************//
        // ValidDate()																		*//
        // Función que se encarga de validar las fechas provenientes del resguardo masivo.	*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	str: carácter de fecha q ser verificado, se devuelve true si es válida, 	*//
        //		false si no cumple con el formato.	 										*//
        // _________________________________________________________________________________*//
        // Salida:  booleano que verifica si la fecha tiene el formato correcto				*//
        // _________________________________________________________________________________*//
        public bool ValidDate(string str)
        {
            
            //Compruebo que la longitud sea la adecuada
            if (str.Length == 1)
                return true;

            //Verificando que se tenga 3 strings provenientes
            //del archivo de carga masiva. Si no es asi 
            //devuelvo false.
            var split = str.Split('T');
            split = split[0].Split('-');
            if (split.Length != 3)
                return false;

            var year = Convert.ToInt32(split[0]);
            var month = Convert.ToInt32(split[1]);
            var day = Convert.ToInt32(split[2]);

            //Verificaciones de fecha, mes y año
            //No se aceptan años menores a 2000
            //en la incorporacion de nuevos BI
            if (year < 2000)
                return false;
            if (month < 1 || month > 12)
                return false;
            if (day < 1 || day > 31)
                return false;

            return true;
        }

        //***********************************************************************************//
        // Autor:  										                    				*//
        //***********************************************************************************//
        // ValidateRow()																	*//
        // Función que se encarga de validar una fila de la tabla de carga de resguardo 	*//
        // masivo.																			*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	al: lista que contiene todos los valores provenientes de una fila del 		*//
        //		archivo de carga de resguardo masivo.										*//
        // _________________________________________________________________________________*//
        // Salida:  booleano que verifica si la fila tiene el formato correcto				*//
        // _________________________________________________________________________________*//
        public bool ValidateRow(ArrayList al)
        {
            //Validación del Serial
            if (al[0].ToString().Length == 0)  
            {
                return false;
            }
            else if (al[1].ToString().Length == 0)  //Validación del Modelo
            {
                return false;
            }
            else if (al[2].ToString().Length == 0)  //Número Activo Fijo/ Arre
            {
                return false;
            }
            else if (al[3].ToString().Length == 0)  //Número Factura / Etiq
            {
                return false;
            }
            else if (al[4].ToString().Length == 0 || !ValidDate(al[4].ToString()))  //Validación Fecha Inic Arre / Gar
            {
                return false;
            }
            else if (al[5].ToString().Length == 0 || !ValidDate(al[5].ToString()))  //Validación Fecha Fin Arre / Gar
            {
                return false;
            }
            return true;
        }

        //***********************************************************************************//
        // Autor:  								                		     				*//
        //***********************************************************************************//
        // ValidateRowGen()																	*//
        // Función que se encarga de validar la fila de encabezado del archivo de resguardo *//
        // masivo.																			*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	al: lista que contiene todos los valores provenientes de la fila de 		*//
        //		encabezado del archivo de carga de resguardo masivo.						*//
        // _________________________________________________________________________________*//
        // Salida:  booleano que verifica si la fila de encabezado tiene el formato correcto*//
        // _________________________________________________________________________________*//
        public bool ValidateRowGen(ArrayList al)
        {
            //Validacion Tipo de Bien
            /*  Cambio 22/10/2012
             *  Se agrego el tipo de Bien: Compra
             * 
            if (al[0].ToString().Length == 0 || (al[0].ToString() != "Arrendado" && al[0].ToString() != "Activo Fijo"))  
            {
                return false;
            }
            */
            if (al[0].ToString().Length == 0)  
            {
                return false;
            }
            else if (al[5].ToString().Length == 0 || !ValidDate(al[5].ToString()))  //Fecha Adquisicion
            {
                return false;
            }
            else if (al[7].ToString().Length == 0 || (al[7].ToString() != "0044" && al[7].ToString() != "0050"))  //Validación Sociedad
            {
                return false;
            }
            return true;
        }

        //***********************************************************************************//
        // Autor:  									                	     				*//
        //***********************************************************************************//
        // ValidateUniqueSerial()															*//
        // Función que se encarga de validar que no existan dos seriales iguales en la filas*//
        // del archivo de resguardo masivo  												*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	g: lista que contiene todos los valores de filas que están bien 			*//
        //		estructuradas para realizar el resguardo masivo								*//
        // •	b: lista que contiene todos los valores de filas que no están bien		 	*//
        //		estructuradas para realizar el resguardo masivo.							*//
        // _________________________________________________________________________________*//
        // Salida:  string que devuelve una alerta de seriales repetidos en el archivo excel*//
        // _________________________________________________________________________________*//
        public string ValidateUniqueSerial(List<ArrayList> g, List<ArrayList> b)
        {
            //Busqueda de seriales que coinciden en la lista goods
            var ret = "Los seriales de varios bienes coinciden. Por favor, modifíquelos e intente de nuevo.";
            for (var i = 0; i < g.Count; i++)
            {
                for (var ii = 0; ii < g.Count; ii++)
                {
                    if (i != ii)
                        if (((string)g.ElementAt(i)[0]) == ((string)g.ElementAt(ii)[0]))
                            return ret;
                }
            }
            //Busqueda de seriales que coinciden en la lista bads
            for (var i = 0; i < b.Count; i++)
            {
                for (var ii = 0; ii < b.Count; ii++)
                {
                    if (i != ii)
                        if (((string)b.ElementAt(i)[0]) == ((string)b.ElementAt(ii)[0]))
                            return ret;
                }
            }
            return "";
        }

        //***********************************************************************************//
        // Autor:  										                    				*//
        //***********************************************************************************//
        // ValidateModeloInDB()																*//
        // Función que se encarga de validar que los modelos de equipo proporcionados en el *//
        // archivo de resguardo masivo coincidan con los registrados en BD.  				*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	g: lista que contiene todos los valores de filas que están bien 			*//
        //		estructuradas para realizar el resguardo masivo.							*//
        // _________________________________________________________________________________*//
        // Salida:  string que devuelve una alerta de modelos no existentes.				*//
        // _________________________________________________________________________________*//
        public string ValidateModeloInDB(List<ArrayList> g)
        {
            var ret = "Los Modelos de varios bienes no coinciden con los existentes en Base de Datos. Por favor, verifíquelos e intente de nuevo.";
            //Buscando los modelos que se encuentran en Base de Datos
            var modeloDB = (from m in db.MarcaModeloes select m).ToList();
            var good = false;

            //Realizando la comparación entre los modelos de Base de Datos
            //y los que se han obtenido del archivo XML
            for (var i = 0; i < g.Count; i++)
            {
                good = false;
                foreach (var j in modeloDB)
                {
                    if (((string)g.ElementAt(i)[1]) == j.cmod)
                    {
                        good = true;
                        break;
                    }
                }
                if (!good)
                    return ret;
            }
            return "";
        }

        //***********************************************************************************//
        // Autor:  										                     				*//
        //***********************************************************************************//
        // ValidateUniqueSerialInDB()														*//
        // Función que se encarga de validar que los seriales de equipo proporcionados en el*//
        // archivo de resguardo masivo no coincidan con los registrados en BD.  			*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	g: lista que contiene todos los valores de filas que están bien 			*//
        //		estructuradas para realizar el resguardo masivo. 							*//
        // _________________________________________________________________________________*//
        // Salida:  string que devuelve una alerta de seriles duplicados en BD.				*//
        // _________________________________________________________________________________*//
        public string ValidateUniqueSerialInDB(List<ArrayList> g)
        {
            var ret = "Uno o varios seriales coinciden con los existente en la Base de Datos. Por favor, modifíquelos e intente de nuevo.";
            //Buscando los seriales que se encuentran en Base de Datos
            var BienInformaticoIdDB = (from m in db.BienInformaticoes select m).ToList();

            //Realizando la comparación entre los seriales de Base de Datos
            //y los que se han obtenido del archivo XML. Si se encuentra
            //alguna coincidencia se devuelve el mensaje de error.
            for (var i = 0; i < g.Count; i++)
            {
                foreach (var j in BienInformaticoIdDB)
                {
                    if (((string)g.ElementAt(i)[0]) == j.BienInformaticoId)
                        return ret;
                }
            }
            return "";
        }

        //***********************************************************************************//
        // Autor:               	                                                       *//
        //***********************************************************************************//
        // AllBlank()																		*//
        // Función que se encarga de verificar que se tenga la cantidad correcta de datos y *//
        //  que no sean vacio (string vacio)                                                *//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	al: lista que contiene todos los valores provenientes de una fila del 		*//
        //		archivo de carga de resguardo masivo.										*//
        // _________________________________________________________________________________*//
        // Salida:  boleano que devuelve true si se ha encontrado un error o false en otro  *//
        //  caso.                                                                           *//
        // _________________________________________________________________________________*//
        public bool AllBlank(ArrayList al)
        {
            //Primero se verifica que se tenga el número correcto de líneas, menor a 6.
            if (al.Count < 6)
            {
                //Se verifica que para dato en la fila no sea vacío. Si es así se envíe
                //un mensaje de error. 
                foreach (var i in al)
                    if ((string)i != string.Empty)
                        throw new ArgumentException("Error: Número de Rows");
                return true;
            }
            return false;
        }

        //***********************************************************************************//
        // Autor:  										                     				*//
        //***********************************************************************************//
        // DownLoadFile()																	*//
        // Acción que se encarga de proporcionar la descarga del archivo modelo para la 	*//
        // carga masiva.														 			*//
        // _________________________________________________________________________________*//
        // Entrada: 	none																*//
        // _________________________________________________________________________________*//
        // Salida:  Archivo XML para realizar al carga masiva								*//
        // _________________________________________________________________________________*//
        public ActionResult DownLoadFile()
        {
            //Dirección del archivo que va a ser descargado y servirá como 
            //para la carga masiva.
            var fileStream = new FileStream(Server.MapPath("~/Content/XML/FormatoCargaMasivaBienes.xml"), FileMode.Open);
            //Nombre con el cual se va a descargar el archivo
            var fileDownloadName = "FormatoCargaMasivaBienes.xml";

            //Formato en el cual se a descargar el archivo.
            //Application/vnd.ms-excel 
            return File(fileStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", fileDownloadName);
        }

        //***********************************************************************************//
        // Autor:  										                    				*//
        //***********************************************************************************//
        // notEmptyFile()		    Acceso solo ADMINISTRADOR								*//
        // Verificar si realmente el usuario a elegido un archivo							*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	file: archivo que ha elegido el usuario.									*//
        // _________________________________________________________________________________*//
        // Salida:  Booleano que devuelve true si el usuario elegio un archivo				*//
        //          o false en otro caso.                                                   *//     
        // _________________________________________________________________________________*//
        public bool notEmptyFile(HttpPostedFileBase file)
        {
            var valid = false;

            //Se debe tener un archivo o su longitud ser mayor a 0
            if (file != null && file.ContentLength > 0)
                valid = true;
            return valid;
        }

        //***********************************************************************************//
        // Autor:  										                    				*//
        //***********************************************************************************//
        // validFileFormat()		Acceso solo ADMINISTRADOR						    	*//
        // Acción que se encarga de verificar la extencion de un archivo                    *//     
        // _________________________________________________________________________________*//
        // Entrada: 														    			*//
        // •	fileName: nombre del archivo que el usuario.								*//
        // _________________________________________________________________________________*//
        // Salida:  Mensaje de error en caso de encontrar que la extension del archivo      *//
        //          no es XML. En otro caso devuelve string vacio.                          *//
        // _________________________________________________________________________________*//
        public string validFileFormat(string fileName)
        {
            var valid = "";

            //Verificando la extension del archivo. Debe ser XML por defecto.
            var fileNameSplit = fileName.Split('.');
            if (fileNameSplit[1] != "xml")
                valid = "Error: En la extension del archivo";

            return valid;
        }

        //***********************************************************************************//
        // Autor:  										                    				*//
        //***********************************************************************************//
        // returnError()		Acceso solo ADMINISTRADOR				    				*//
        // Acción que se encarga de colocar el mensaje de error de la vista (ViewBag)       *//
        //   
        // _________________________________________________________________________________*//
        // Entrada: 	    																*//
        // •	errorMessage: nombre del mensaje de error a guardar							*//
        // _________________________________________________________________________________*//
        // Salida:  none                                        							*//
        // _________________________________________________________________________________*//
        public void returnError(string errorMessage)
        {
            //Se asigna el mensaje de error especificado a una variable
            //con ámbito en la vista.
            ViewBag.Message = errorMessage;
        }

        //***********************************************************************************//
        // Autor:  										                       				*//
        //***********************************************************************************//
        // saveDataGeneralFromFile()		Acceso solo ADMINISTRADOR			    		*//
        // Acción que se encarga de almacenar en una estructura Lista (List) los valores    *//
        // generales del archivo (encabezado del archivo XML).                              *//
        // _________________________________________________________________________________*//
        // Entrada: 							    										*//
        // •	xDoc: documento XML que contiene nos permite extraer los datos del          *//
        //      archivo de XML.                                                             *//
        // _________________________________________________________________________________*//
        // Salida:  Lista (List) que contendra los datos del encabezado del archivo XML     *//
        // _________________________________________________________________________________*//
        public List<ArrayList> saveDataGeneralFromFile(XmlDocument xDoc)
        {
            //Estructura lista (list) en donde se almacenará
            //los datos del encabezado tomados del archivo XML
            List<ArrayList> dataGen = new List<ArrayList>();

            //Se toma las filas del archivo XML
            XmlNodeList filas = xDoc.GetElementsByTagName("Row");
            int lncol;

            //Obteniendo el encabezado del archivo XML
            for (var lnfila = 0; lnfila < filas.Count; lnfila++)
            {
                if (lnfila != 0 && lnfila != 2 && lnfila != 3)
                {
                    ArrayList dr = new ArrayList(filas.Count);
                    if (lnfila == 1)
                    {
                        //Guardando el encabezado en la estructura Lista
                        //dataGen. En caso que no halla pasado la validación
                        //se devuelve un mensaje de error.
                        for (lncol = 0; lncol < 9; lncol++)
                        {
                            //La fila se guarda en un estructura auxiliar dr.
                            dr.Add(filas[lnfila].ChildNodes[lncol].InnerText);
                        }
                        if (ValidateRowGen(dr))
                            dataGen.Add(dr);
                        else returnError("El archivo no puede ser interpretado. Por favor, verifique que este bien estructurado e intentelo de nuevo");
                    }
                }
            }
            return dataGen;
        }

        //***********************************************************************************//
        // Autor:  								                		     				*//
        //***********************************************************************************//
        // saveDataVariableFromFile()		Acceso solo ADMINISTRADOR			    		*//
        // Acción que se encarga de almacenar en una estructura Lista (List) los valores    *//
        // variables, que son los nuevos BI a almacenar.                                    *//
        // _________________________________________________________________________________*//
        // Entrada: 							    										*//
        // •	xDoc: documento XML que contiene nos permite extraer los datos del          *//
        //      archivo de XML.                                                             *//
        // •	goods: contendrá los datos que han tenido una verificación correcta luego   *//
        //      de realizado su extracción del archivo XML.                                 *//
        // •	goods: contendrá los datos que han tenido una verificación incorrecta luego *//
        //      de realizado su extracción del archivo XML.                                 *//
        // _________________________________________________________________________________*//
        // Salida:  none                                                                    *//
        // _________________________________________________________________________________*//
        public void saveDataVariableFromFile(XmlDocument xDoc, out List<ArrayList> goods, out List<ArrayList> bads)
        {
            //Estructura lista (list) en donde se almacenará
            //los datos correctos tomados del archivo XML
            goods = new List<ArrayList>();
            //Estructura lista (list) en donde se almacenará
            //los datos que tuvieron algún problema del archivo XML
            bads = new List<ArrayList>();

            //Se toma las filas del archivo XML
            XmlNodeList filas = xDoc.GetElementsByTagName("Row");
            int lncol;

            //Obteniendo el encabezado del archivo XML
            for (var lnfila = 0; lnfila < filas.Count; lnfila++)
            {
                if (lnfila != 0 && lnfila != 2 && lnfila != 3)
                {
                    ArrayList dr = new ArrayList(filas.Count);
                    if (lnfila != 1)
                    {
                        //Guardando los datos de los Bienes Informáticos
                        for (lncol = 0; lncol < filas[lnfila].ChildNodes.Count; lncol++)
                        {
                            //La fila se guarda en un estructura auxiliar dr.
                            dr.Add(filas[lnfila].ChildNodes[lncol].InnerText);
                        }
                        //Se realiza la verificación de la fila. Debe contener
                        //un número adecuado de campos
                        if (AllBlank(dr))
                            continue;
                        //Verifica si la fila está bien estructurada: sus datos de fecha, 
                        //números, etc, estan bien definidos
                        if (ValidateRow(dr))
                            goods.Add(dr);
                        else
                            bads.Add(dr);
                    }
                }
            }
        }

        //***********************************************************************************//
        // Autor:  										                     				*//
        //***********************************************************************************//
        // savingInDB()		        Acceso solo ADMINISTRADOR								*//
        // Acción que se encarga de realizar guardar en la base de datos todos los datos    *//
        // que han sido previamente verificados.                                            *//
        // _________________________________________________________________________________*//
        // Entrada: 	    																*//
        // •	dataGen: contiene los datos generales (encabeza) extraidos del archivo XML  *//
        // •	goods: contiene los datos que han tenido una verificación correcta luego    *//
        //      de realizado su extracción del archivo XML.                                 *//
        // _________________________________________________________________________________*//
        // Salida:  none                                        							*//
        // _________________________________________________________________________________*//
        public void savingInDB(List<ArrayList> dataGen, List<ArrayList> goods)
        {
            //------- Obteniendo Datos del Encabezado del Archivo XML -------------

            //Conjunto de variables que nos serviran para almacenar valores
            //que luego seran salvados en Base de Datos
            DateTime? dfvaAux = null;

            // Se agregó el tipo de bien: Compra
            // var tipoBienAux = 1;
            var tipoBienAux = 0;
            var sociedadAux = 1;
            var cubfStr = "";
            var EstadoIdInt = 0;
            var CargoIdStr = "";
            var ceco_idStr = "";
            var localidad_idStr = "";

            //Obteniendo la fecha de vencimiento desde el archivo XML.
            //Se almacena en la variable dfvaAux
            if ((string)dataGen.ElementAt(0)[5] != "0")
            {
                var dfvaSplit = dataGen.ElementAt(0)[5].ToString().Split('T');
                dfvaSplit = dfvaSplit[0].ToString().Split('-');
                dfvaAux = new DateTime(Convert.ToInt32(dfvaSplit[0]), Convert.ToInt32(dfvaSplit[1]), Convert.ToInt32(dfvaSplit[2]), 00, 00, 00, 000);
            }

            //Obteniendo el tipo de bien informático desde el archivo XML.
            //Se almacena en la variable tipoBienAux
            /* Cambio 22/10/2012
             * Se agrego el tipo de Bien: Compra
             */
            // if ((string)dataGen.ElementAt(0)[0] == "Arrendado")
            //    tipoBienAux = 2;
            if ((string)dataGen.ElementAt(0)[0] == "Activo Fijo")
                tipoBienAux = 1;
            if ((string)dataGen.ElementAt(0)[0] == "Arrendado")
                tipoBienAux = 2;
            if ((string)dataGen.ElementAt(0)[0] == "Compra")
                tipoBienAux = 3;

            //Obteniendo la sociedad desde el archivo XML.
            //Se almacena en la variable sociedadAux
            if ((string)dataGen.ElementAt(0)[0] == "0050")
                sociedadAux = 2;

            //Conjunto de variables que son tomados del archivo XML
            cubfStr = (string)dataGen.ElementAt(0)[8];
            EstadoIdInt = Convert.ToInt32(dataGen.ElementAt(0)[3]);
            CargoIdStr = (string)dataGen.ElementAt(0)[4];
            ceco_idStr = (string)dataGen.ElementAt(0)[1];
            localidad_idStr = (string)dataGen.ElementAt(0)[2];
            //------- FIN Datos del Encabezado del Archivo XML -------------

            // -------------- Bienes Informáticos Agregados nuevos ------------------//
            //Almacenar en Base de Datos todos los Bienes Informáticos nuevos
            //que se han obtenido del archivo XML
            var nanfAux = string.Empty;
            var nenaAux = string.Empty;

            DateTime? digaAux = null;
            DateTime? dfgaAux = null;

            var marcaModeloAux = 0;
            var marcaModeloStr = "";
            var BienInformaticoIdStr = "";
            for (var i = 0; i < goods.Count; i++)
            {
                //Incialización de variables que contendran
                //los valores de los nuevos Bienes Informáticos
                //a ser almacenados en Base de Datos
                nanfAux = string.Empty;
                nenaAux = string.Empty;

                digaAux = null;
                dfgaAux = null;

                marcaModeloAux = 0;
                marcaModeloStr = "";
                BienInformaticoIdStr = "";

                //Obteniendo el numero de anexo desde el archivo XML.
                //Se almacena en la variable nanfAux
                if ((string)goods.ElementAt(i)[2] != "0")
                    nanfAux = (string)goods.ElementAt(i)[2];

                //Obteniendo el numero de etiquetado desde el archivo XML.
                //Se almacena en la variable nenaAux
                if ((string)goods.ElementAt(i)[3] != "0")
                    nenaAux = (string)goods.ElementAt(i)[3];

                //Obteniendo la fecha inicio de anexo desde el archivo XML.
                //Se almacena en la variable digaAux
                if ((string)goods.ElementAt(i)[4] != "0")
                {
                    var digaSplit = goods.ElementAt(i)[4].ToString().Split('T');
                    digaSplit = digaSplit[0].ToString().Split('-');
                    digaAux = new DateTime(Convert.ToInt32(digaSplit[0]), Convert.ToInt32(digaSplit[1]), Convert.ToInt32(digaSplit[2]), 00, 00, 00, 000);
                }

                //Obteniendo la fecha fin de anexo desde el archivo XML.
                //Se almacena en la variable dfgaAux
                if ((string)goods.ElementAt(i)[5] != "0")
                {
                    var dfgaSplit = goods.ElementAt(i)[5].ToString().Split('T');
                    dfgaSplit = dfgaSplit[0].ToString().Split('-');
                    dfgaAux = new DateTime(Convert.ToInt32(dfgaSplit[0]), Convert.ToInt32(dfgaSplit[1]), Convert.ToInt32(dfgaSplit[2]), 00, 00, 00, 000);
                }

                //Obteniendo la marcaModelo desde el archivo XML.
                //Se almacena en la variable marcaModeloStr
                marcaModeloStr = (string)goods.ElementAt(i)[1];

                //Obteniendo el id de marcaModelo desde el archivo XML.
                //Se almacena en la variable marcaModeloAux
                marcaModeloAux = (from m in db.MarcaModeloes
                                  where marcaModeloStr == m.cmod
                                  select m.MarcaModeloId).First();

                //Obteniendo el id del serial desde el archivo XML.
                //Se almacena en la variable BienInformaticoIdStr
                BienInformaticoIdStr = (string)goods.ElementAt(i)[0];

                //Se almacena en una estructura BienInformatico
                //para luego ser almacenado en Base de Datos
                BienInformatico bi = new BienInformatico
                {
                    BienInformaticoId = BienInformaticoIdStr,
                    cubf = cubfStr,
                    nanf = nanfAux,
                    nena = nenaAux,
                    dfva = dfvaAux,
                    diga = digaAux,
                    dfga = dfgaAux,
                    EstadoId = EstadoIdInt,
                    TipoBienId = tipoBienAux,
                    SociedadId = sociedadAux,
                    DivisionId = "0000",
                    CargoId = CargoIdStr,
                    MarcaModeloId = marcaModeloAux,
                    ceco_id = ceco_idStr,
                    localidad_id = localidad_idStr
                };
                //Se almacena en Base de Datos.
                //Observacion: con esta instrucción no se asegura que la información
                //este guardada en Base de Datos. Es necesario ejecutar el dump de Base
                //de Datos. Para ello se utilizada la instrucción db.SaveChanges() realizada
                //posteriormente.
                db.BienInformaticoes.Add(bi);
                db.SaveChanges();

                var cargoN = (from m in db.Cargoes
                              where m.CargoId == bi.CargoId
                              select m).ToList().FirstOrDefault();

                var obs = "Cargo involucrado en movimiento. " + cargoN.cdes.Replace('.', ' ') + ", " + cargoN.empleados.Replace('.', ' ') + ". "; 

                // Carga Movimiento
                creacionMovimiento("Entrada", obs + "Resguardo Masivo", "Deposito", "0002", 2, BienInformaticoIdStr);
            }
            // -------------- FIN Bienes Informáticos Agregados ------------------//
        }

        //***********************************************************************************//
        // Autor:  								                		     				*//
        //***********************************************************************************//
        // ResguardoMasivo()		Acceso solo ADMINISTRADOR								*//
        // Acción que se encarga de realizar el resguardo masivo de los bienes informáticos	*//														 			
        // Metodo GET. 																		*//
        // _________________________________________________________________________________*//
        // Entrada: 	none																*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve la carga masiva de los BI.							*//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult ResguardoMasivo()
        {
            ViewBag.Message = "";
            ViewBag.UniqueSerial = "";
            ViewBag.ModeloInDBB = "";
            ViewBag.DataGen = new List<ArrayList>();
            ViewBag.Goods = new List<ArrayList>();
            ViewBag.Bads = new List<ArrayList>();
            return View();
        }

        //***********************************************************************************//
        // Autor:  										                     				*//
        //***********************************************************************************//
        // ResguardoMasivo()		Acceso solo ADMINISTRADOR								*//
        // Acción que se encarga de realizar el resguardo masivo de los bienes informáticos	*//														 			
        // Metodo POST. 																	*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	file: archivo que contiene todos los datos en formato para la carga masiva. *//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve la carga masiva de los BI.							*//
        // _________________________________________________________________________________*//
        [HttpPost]
        public ActionResult ResguardoMasivo(HttpPostedFileBase file)
        {
            ViewBag.UniqueSerial = "";
            ViewBag.ModeloInDB = "";
            ViewBag.Message = "";
            XmlDocument xDoc = new XmlDocument();
            List<ArrayList> goods = new List<ArrayList>();
            List<ArrayList> bads = new List<ArrayList>();
            List<ArrayList> dataGen = new List<ArrayList>();

            //Verifico que el usuario elegió un archivo
            if (notEmptyFile(file))
            {
                try
                {
                    //Extrayendo solo el archivo
                    var fileName = Path.GetFileName(file.FileName);

                    //Verificacion que su formato es XML
                    var extractedFile = validFileFormat(fileName);
                    if (extractedFile != "")
                    {
                        returnError(extractedFile);
                        return View();
                    }

                    //Guarda el archivo en la carpeta: ~/App_Data/uploads 
                    var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
                    file.SaveAs(path);

                    // ----------- Inicio Validacion del Archivo -----------//
                    //Cargando el archivo que se guardó en el servidor
                    xDoc.Load(Server.MapPath("~/App_Data/uploads/" + fileName));

                    //Validando la data general (encabezado del archivo XML)
                    dataGen = saveDataGeneralFromFile(xDoc);

                    //Validando la data variable (nuevos BI)
                    saveDataVariableFromFile(xDoc, out goods, out bads);

                    //Validar que no se repitan seriales
                    ViewBag.UniqueSerial = ValidateUniqueSerial(goods, bads);
                    ViewBag.DataGen = dataGen;
                    ViewBag.Goods = goods;
                    ViewBag.Bads = bads;

                    // -------------- Guardando ------------------//
                    //Caso en que se desea salvar la información
                    if (bads.Count == 0 && ViewBag.UniqueSerial == "")
                    {
                        //Chequeo que no exista duplicidad de seriales con los existentes en BD
                        ViewBag.UniqueSerial = ValidateUniqueSerialInDB(goods);
                        //Validar que las marcas esten en Base de Datos
                        ViewBag.ModeloInDB = ValidateModeloInDB(goods);
                        if (ViewBag.UniqueSerial != "" || ViewBag.ModeloInDB != "")
                            return View();

                        //Colocando la información en la estructura de Base de Datos
                        savingInDB(dataGen, goods);
                        
                        //Operación exitosa. Se redirige a el SearchIndex
                        return RedirectToAction("SearchIndex");
                    }
                    // --------------Fin Guardado ------------------//
                }
                catch (Exception)
                {
                    ViewBag.Message = "El archivo no puede ser interpretado. Por favor, verifique que este bien estructurado e intentelo de nuevo";
                }
            }
            else
            {
                ViewBag.Message = "El archivo no existe o no puede ser interpretado. Por favor, intentelo de nuevo";
            }

            return View();
        }

        //***********************************************************************************//
        // Autor:  										                     				*//
        //***********************************************************************************//
        // CargaInicial()		Acceso solo ADMINISTRADOR									*//
        // Acción que se encarga de realizar la carga inicial de los bienes informáticos	*//														 			
        // Metodo GET. 																		*//
        // _________________________________________________________________________________*//
        // Entrada: 		none															*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve la carga inicial de los BI.							*//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult CargaInicial()
        {
            ViewBag.Error = "";
            return View();
        }

        //***********************************************************************************//
        // Autor:  									                	     				*//
        //***********************************************************************************//
        // CargaInicial()		Acceso solo ADMINISTRADOR									*//
        // Acción que se encarga de realizar la carga inicial de los bienes informáticos	*//														 			
        // Metodo POST. 																	*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	file: archivo que contiene todos los datos en formato para la carga inicial.*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve la carga inicial de los BI.							*//
        // _________________________________________________________________________________*//
        [HttpPost]
        public ActionResult CargaInicial(HttpPostedFileBase file)
        {
            var lnfila = 0;
            ViewBag.Error = "";
            List<ArrayList> data = new List<ArrayList>();

            // Verify that the user selected a file
            if (file != null && file.ContentLength > 0)
            {
                try{
                    // extract only the filename
                    var fileName = Path.GetFileName(file.FileName);
                    // Checking extension of the file
                    var fileNameSplit = fileName.Split('.');
                    if (fileNameSplit[1] != "xml")
                        throw new ArgumentException("Error: File Extension");
                    // store the file inside ~/App_Data/uploads folder
                    var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
                    file.SaveAs(path);

                    // ----------- Inicio Validacion del Archivo -----------//
                    XmlDocument xDoc = new XmlDocument();

                    xDoc.Load(Server.MapPath("~/App_Data/uploads/" + fileName));
                    XmlNodeList filas = xDoc.GetElementsByTagName("Row");
                    int lncol;
                    for ( lnfila = 0; lnfila < filas.Count; lnfila++)
                    {
                        ArrayList dr = new ArrayList(filas.Count);

                        for (lncol = 0; lncol < 20; lncol++)
                        {
                            dr.Add(filas[lnfila].ChildNodes[lncol].InnerText);
                        }
                        data.Add(dr);
                    }
                }   
                catch (Exception e)
                {
                    ViewBag.Error = "Error: en la linea " + (lnfila++).ToString() + ", "+ e;
                }

                // ----------- Guardando -----------//
                // -----------  Bienes Informáticos Agregando... -----------//
                if (ViewBag.Error == "")
                {
                    for (var i = 0; i < data.Count; i++)
                    {
                        try
                        {
                            string _BienInformaticoId = null;
                            string _cubf = null;
                            string _nanf = null;
                            string _nena = null;
                            DateTime? _dfva = null;
                            DateTime? _dfde = null;
                            DateTime? _diga = null;
                            DateTime? _dfga = null;
                            var _cdes = string.Empty;
                            DateTime? _dfpr = null;
                            //var _cflg = false; 
                            string _PadreId = null;
                            var _EstadoId = 0;
                            var _TipoBienId = 0;
                            var _SociedadId = 0;
                            string _DivisionId = null;
                            string _CargoId = null;
                            var _MarcaModeloId = 0;
                            string _ceco_id = null;
                            string _localidad_id = null;

                            // Bien Informatico
                            _BienInformaticoId = (string)data.ElementAt(i)[0];
                            _BienInformaticoId.Trim();

                            // Ubicacion Fisica
                            _cubf = (string)data.ElementAt(i)[1];
                            _cubf.Trim();

                            // Numero Anexo/Factura
                            if ((string)data.ElementAt(i)[2] != "0")
                            {
                                _nanf = (string)data.ElementAt(i)[2];
                                _nanf.Trim();
                            }

                            // Numero Etiqueta/Anexo
                            if ((string)data.ElementAt(i)[3] != "0")
                            {
                                _nena = (string)data.ElementAt(i)[3];
                                _nena.Trim();
                            }

                            // Fecha Adquisicion
                            if ((string)data.ElementAt(i)[4] != "0")
                            {
                                var _dfvaSplit = data.ElementAt(i)[4].ToString().Split('T');
                                _dfvaSplit = _dfvaSplit[0].ToString().Split('-');
                                _dfva = new DateTime(Convert.ToInt32(_dfvaSplit[0]), Convert.ToInt32(_dfvaSplit[1]), Convert.ToInt32(_dfvaSplit[2]), 00, 00, 00, 000);
                            }

                            // Fecha Desincorporacion
                            if ((string)data.ElementAt(i)[5] != "0")
                            {
                                var _dfdeSplit = data.ElementAt(i)[5].ToString().Split('T');
                                _dfdeSplit = _dfdeSplit[0].ToString().Split('-');
                                _dfde = new DateTime(Convert.ToInt32(_dfdeSplit[0]), Convert.ToInt32(_dfdeSplit[1]), Convert.ToInt32(_dfdeSplit[2]), 00, 00, 00, 000);
                            }

                            // Fecha Inicio Garantia/Anexo
                            if ((string)data.ElementAt(i)[6] != "0")
                            {
                                var _digaSplit = data.ElementAt(i)[6].ToString().Split('T');
                                _digaSplit = _digaSplit[0].ToString().Split('-');
                                _diga = new DateTime(Convert.ToInt32(_digaSplit[0]), Convert.ToInt32(_digaSplit[1]), Convert.ToInt32(_digaSplit[2]), 00, 00, 00, 000);
                            }

                            // Fecha Fin Garantia/Anexo
                            if ((string)data.ElementAt(i)[7] != "0")
                            {
                                var _dfgaSplit = data.ElementAt(i)[7].ToString().Split('T');
                                _dfgaSplit = _dfgaSplit[0].ToString().Split('-');
                                _dfga = new DateTime(Convert.ToInt32(_dfgaSplit[0]), Convert.ToInt32(_dfgaSplit[1]), Convert.ToInt32(_dfgaSplit[2]), 00, 00, 00, 000);
                            }

                            // Descripcion
                            if ((string)data.ElementAt(i)[8] != "0")
                            {
                                _cdes = (string)data.ElementAt(i)[8];
                                _cdes.Trim();
                            }

                            // Fecha Prestamo
                            if ((string)data.ElementAt(i)[9] != "0")
                            {
                                var _dfprSplit = data.ElementAt(i)[9].ToString().Split('T');
                                _dfprSplit = _dfprSplit[0].ToString().Split('-');
                                _dfpr = new DateTime(Convert.ToInt32(_dfprSplit[0]), Convert.ToInt32(_dfprSplit[1]), Convert.ToInt32(_dfprSplit[2]), 00, 00, 00, 000);
                            }

                            // Flag
                            // _cflag = data.ElementAt(i)[10];

                            // Padre Id
                            if ((string)data.ElementAt(i)[11] != "0")
                            {
                                _PadreId = (string)data.ElementAt(i)[11];
                                _PadreId.Trim();
                            }

                            // Estado Id
                            if ((string)data.ElementAt(i)[12] != "0")
                            {
                                _EstadoId = Convert.ToInt32(data.ElementAt(i)[12]);
                            }

                            // Tipo Bien Id
                            if ((string)data.ElementAt(i)[13] != "0")
                            {
                                _TipoBienId = Convert.ToInt32(data.ElementAt(i)[13]);
                            }

                            // Sociedad Id
                            if ((string)data.ElementAt(i)[14] != "0")
                            {
                                if ((string)data.ElementAt(i)[14] == "0044")
                                    _SociedadId = 1;
                                else
                                    _SociedadId = 2;
                            }

                            // Division Id
                            if ((string)data.ElementAt(i)[15] != "0")
                            {
                                _DivisionId = (string)data.ElementAt(i)[15];
                                _DivisionId.Trim();
                            }

                            // Cargo Id
                            if ((string)data.ElementAt(i)[16] != "0")
                            {
                                _CargoId = (string)data.ElementAt(i)[16];
                                _CargoId.Trim();
                            }
                            else {
                                _CargoId = null;
                            }

                            // Marca Modelo Id
                            if ((string)data.ElementAt(i)[17] != "0")
                            {
                                _MarcaModeloId = Convert.ToInt32(data.ElementAt(i)[17]);
                            }

                            // Ceco Id
                            if ((string)data.ElementAt(i)[18] != "0")
                            {
                                _ceco_id = (string)data.ElementAt(i)[18];
                                _ceco_id.Trim();
                            }

                            // Localidad Id
                            if ((string)data.ElementAt(i)[19] != "0")
                            {
                                _localidad_id = (string)data.ElementAt(i)[19];
                                _localidad_id.Trim();
                            }

                            BienInformatico bi = new BienInformatico
                            {
                                BienInformaticoId = _BienInformaticoId,
                                cubf = _cubf,
                                nanf = _nanf,
                                nena = _nena,
                                dfva = _dfva,
                                dfde = _dfde,
                                diga = _diga,
                                dfga = _dfga,
                                cdes = _cdes,
                                dfpr = _dfpr,
                                //cflg = _cflg,
                                PadreId = _PadreId,
                                EstadoId = _EstadoId,
                                TipoBienId = _TipoBienId,
                                SociedadId = _SociedadId,
                                DivisionId = _DivisionId,
                                CargoId = _CargoId,
                                MarcaModeloId = _MarcaModeloId,
                                ceco_id = _ceco_id,
                                localidad_id = _localidad_id
                            };
                            db.BienInformaticoes.Add(bi);
                            db.SaveChanges();
                        }
                        catch (Exception e)
                        {
                            ViewBag.Error = "Error: " + (i++).ToString() + e;
                            return View();
                        }
                    }
                    //--------------- FIN Bienes Informáticos Agregados -------------//

                    ViewBag.Error = "Everything went better than expected :D";
                    //--------------- Fin Guardado -------------//
                }
            }
            else
            {
                ViewBag.Error = "El archivo no existe o no puede ser interpretado. Por favor, intentelo de nuevo";
            }
            return View();
        }

        //***********************************************************************************//
        // Autor:  									                	     				*//
        //***********************************************************************************//
        // sendEmail()		Acceso solo ADMINISTRADOR										*//
        // Función que se encarga de enviar los correos del sistema							*//														 			
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	cc: Lista de correso separados por , a los cuales se desea enviar el mensaje*//
        // •	subject: subject que se va a enviar con el correo							*//	
        // •	body: cuerpo que se va a enviar con el correo								*//	
        // •	isBodyHtml: cboleano que dice si el cuerpo del correo es en formatao HTML	*//		
        // _________________________________________________________________________________*//
        // Salida:  Devuelve el envio de correo.											*//
        // _________________________________________________________________________________*//
        public void sendEmail(string cc, string subject, string body, bool isBodyHtml)
        {
            //Creación del objeto para enviar correo electronicos
            var mailMessage = new System.Net.Mail.MailMessage();

            string header = "Buen día, <br /><br />La Coordinación de Bienes Informáticos realizó ";
            //Colocando el destinatario del correo
            mailMessage.To.Add(cc);
            //Estableciendo que el cuerpo del correo es en el formato Html
            mailMessage.IsBodyHtml = isBodyHtml;
            //Título del correo
            mailMessage.Subject = subject;
            //Mensaje del correo
            //Colocando el remitente del correo
            mailMessage.From = new MailAddress("admin_sibi@monaca.com.ve");

            // --------------------- op 1 -------------- //
            string footer = "<br /><br /><div style=\"font-size:14px\" >Este mensaje fue enviado automáticamente por el sistema SIBI. <br /><hr /><br />" +
                          "<table style=\"font-size:14px\" border=\"0\">" +
                            "<tr>" +
                            "<td>Johanna Medina</td>" +
                            "<td>Beatriz Olmedillo</td>" +
                            "</tr>" +
                            "<tr>" +
                            "<td>Administrador de Bienes Informáticos &nbsp; </td>" +
                            "<td>Coordinación de Bienes Informáticos</td>" +
                            "</tr>" +
                            "<tr>" +
                            "<td>+58 (212)2079385</td>" +
                            "<td>+58(212)2079269</td>" +
                            "</tr>" +
                            "<tr>" +
                            "<td>jmmedina@monaca.com.ve</td>" +
                            "<td>bolmedillo@monaca.com.ve</td>" +
                            "</tr>" +
                          "</table><br /></div>" +
                          "<img src=\"@@IMAGE@@\" alt=\"\">";
                            
            //string attachmentPath =  @"\comprometidosconmonaca.png";
            string path = Server.MapPath(@"~\Content\images\comprometidosconmonaca.png");

            //generate the contentID string using the datetime
            string contentID = Path.GetFileName(path).Replace(".", "") + "@zofm";

            //create the INLINE attachment<
            Attachment inline = new Attachment(path);
            inline.ContentDisposition.Inline = true;
            inline.ContentDisposition.DispositionType = DispositionTypeNames.Inline;
            inline.ContentId = contentID;
            inline.ContentType.MediaType = "image/png";
            inline.ContentType.Name = Path.GetFileName(path);
            mailMessage.Attachments.Add(inline);

            // replace the tag with the correct content ID
            footer = footer.Replace("@@IMAGE@@", "cid:" + contentID);
            mailMessage.Body = header + body + footer;

            //Envio del correo.
            SmtpClient mailSender = new SmtpClient(); //use this if you are in the development server
            mailSender.Send(mailMessage);

        }


        //***********************************************************************************//
        // Autor:  									                	     				*//
        //***********************************************************************************//
        // creacionMovimiento()		                        							    *//
        // Función que se encarga de realizar los movimientos       						*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	tipoMov: Tipo de movimiento que se esta realizando. Entrada/Salida          *//
        // •	observacion: Observacion que se desea colocar                               *// 
        // •	ubicacionF: Ubicacion fisica en el que queda el BI                          *//
        // •	localidad: Localidad en la que va a estar el BI                             *//	
        // •	causaMov: Causa movimiento, Revision, Asignacion, Resguardo, Mantenimiento  *//
        // •	serial: Serial del BI que realizó el movimiento                             *//
        // _________________________________________________________________________________*//
        // Salida:  Realiza el movimiento dependiendo de los parametros colocados			*//
        // _________________________________________________________________________________*//
        private void creacionMovimiento(string tipoMov, string observacion, 
                            string ubicacionF, string localidad, 
                            int causaMov, string serial)
        {

            Movimiento movimiento = new Movimiento
            {
                dmov = DateTime.Now.Date,
                dfmo = DateTime.Now.Date,
                ctmo = tipoMov,
                cobs = observacion,
                cubf = ubicacionF,
                localidad_id = localidad,
                CausaMovimientoId = causaMov,
                BienInformaticoId = serial
            };
            db.Movimientoes.Add(movimiento);

            db.SaveChanges();
        }


        //***********************************************************************************//
        // Autor:  										                     				*//
        //***********************************************************************************//
        // EditMasivo()		Acceso ADMINISTRADOR								*//
        // Acción que devuelve la vista de todos los ítems de BI listados, paginados y con 	*//
        // opción de búsqueda y edición.		 											*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	msnCorreo: mensaje que indica si se logró enviar el correo electrónico de 	*//
        //		notificación de movimiento o  no.											*//
        // •	Page: entero que denota el numero de pagina que se tiene en la lista de 	*//
        // 		búsqueda, por defecto es 1.													*//
        // •	Parámetros con prefijo search: caracteres por los cuales se va a filtrar la *//
        // 		búsqueda. 																	*//
        // •	Parámetros con prefijo current: caracteres que guardan la ultima búsqueda de*// 
        // 		filtrado para mantenerla durante los cambios de página. 					*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que posee todos los bienes informáticos listados deseados			*//
        // _________________________________________________________________________________*//
        public ActionResult EditMasivo()
        {
            return View();
        }

        private string GetFilter(string searchingName, 
            JqGridSearchOperators searchingOperator, 
            string searchingValue)
        {
            string searchingOperatorString = String.Empty;
            switch (searchingOperator)
            {
                case JqGridSearchOperators.Eq:
                    searchingOperatorString = "=";
                    break;
                case JqGridSearchOperators.Ne:
                    searchingOperatorString = "!=";
                    break;
                case JqGridSearchOperators.Lt:
                    searchingOperatorString = "<";
                    break;
                case JqGridSearchOperators.Le:
                    searchingOperatorString = "<=";
                    break;
                case JqGridSearchOperators.Gt:
                    searchingOperatorString = ">";
                    break;
                case JqGridSearchOperators.Ge:
                    searchingOperatorString = ">=";
                    break;
            }

            if (searchingName == "EstadoId" || searchingName == "TipoBienId" ||
                searchingName == "MarcaModeloId" )
                return String.Format("{0} {1} {2}", searchingName, searchingOperatorString, searchingValue);
            if (searchingName == "DivisionId") return String.Format("{0} {1} \"{2}\"", searchingName, searchingOperatorString, searchingValue);

            if (searchingName == "BienInformaticoId" || searchingName == "CargoId" || 
                searchingName == "nanf" || searchingName == "dfva" || searchingName == "ceco_id")
            {
                switch (searchingOperator)
                {
                    case JqGridSearchOperators.Bw:
                        return String.Format("{0}.StartsWith(\"{1}\")", searchingName, searchingValue);
                    case JqGridSearchOperators.Bn:
                        return String.Format("!{0}.StartsWith(\"{1}\")", searchingName, searchingValue);
                    case JqGridSearchOperators.Ew:
                        return String.Format("{0}.EndsWith(\"{1}\")", searchingName, searchingValue);
                    case JqGridSearchOperators.En:
                        return String.Format("!{0}.EndsWith(\"{1}\")", searchingName, searchingValue);
                    case JqGridSearchOperators.Cn:
                        return String.Format("{0}.Contains(\"{1}\")", searchingName, searchingValue);
                    case JqGridSearchOperators.Nc:
                        return String.Format("!{0}.Contains(\"{1}\")", searchingName, searchingValue);
                    default:
                        return String.Format("{0} {1} \"{2}\"", searchingName, searchingOperatorString, searchingValue);
                }
            }

            return String.Empty;
        }

        public string getCargoQuery(string value){

            StringBuilder filterExpressionBuilder = new StringBuilder();
            //string filterExpresion = String.Empty;
            IQueryable<Cargo> filCargos = db.Cargoes.Where(c => c.empleados.Contains(value));

            foreach (var cargos in filCargos)
            {
                filterExpressionBuilder.Append(GetFilter("CargoId", JqGridSearchOperators.Bw, cargos.CargoId));
                filterExpressionBuilder.Append(String.Format(" {0} ", "OR"));
            }
            if (filterExpressionBuilder.Length > 0)
                filterExpressionBuilder.Remove(filterExpressionBuilder.Length - "OR".Length - 2, "OR".Length + 2);
            return '(' + filterExpressionBuilder.ToString() + ')';
        }

        public IQueryable<BienInformatico> GetBIs(string filterExpression, string sortExpression, string sortDirection, int pageIndex, int pageSize, int pagesCount, bool isCargoId, string valueCargoId)
        {
            string filterExpressionCargos = "";
            if (!String.IsNullOrWhiteSpace(filterExpression))
                if (!isCargoId)
                    return db.BienInformaticoes.Where(filterExpression).OrderBy(sortExpression + " " + sortDirection).Skip(pageIndex * pageSize).Take(pageSize);
                else
                {
                    filterExpressionCargos = getCargoQuery(valueCargoId);
                    return db.BienInformaticoes.Where(filterExpression + "AND" + filterExpressionCargos).OrderBy(sortExpression + " " + sortDirection).Skip(pageIndex * pageSize).Take(pageSize);
                }
            else
            {
                if (!isCargoId)
                    return db.BienInformaticoes.OrderBy(sortExpression + " " + sortDirection).Skip(pageIndex * pageSize).Take(pagesCount * pageSize);
                else
                {
                    filterExpression = getCargoQuery(valueCargoId);
                    return db.BienInformaticoes.Where(filterExpression).OrderBy(sortExpression + " " + sortDirection).Skip(pageIndex * pageSize).Take(pagesCount * pageSize);
                }
            }
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult BI(JqGridRequest request, 
            BienInformatico viewModel)
        {
            bool isCargoId = false;
            string valueCargoId = "";

            string filterExpression = String.Empty;
            if (request.Searching)
            {
                //Single searching
                /*
                if (request.SearchingFilter != null)
                    filterExpression = GetFilter(request.SearchingFilter.SearchingName, request.SearchingFilter.SearchingOperator, request.SearchingFilter.SearchingValue);
                */
                //Advanced searching, Toolbar searching (stringResult = true)
                /*else*/ 
                if (request.SearchingFilters != null)
                {
                    StringBuilder filterExpressionBuilder = new StringBuilder();
                    string groupingOperatorToString = request.SearchingFilters.GroupingOperator.ToString();
                    foreach (JqGridRequestSearchingFilter searchingFilter in request.SearchingFilters.Filters)
                    {
                        if (searchingFilter.SearchingName == "ncar")
                        {
                            isCargoId = true; valueCargoId = searchingFilter.SearchingValue;
                        }
                        else
                        {
                            filterExpressionBuilder.Append(GetFilter(searchingFilter.SearchingName, searchingFilter.SearchingOperator, searchingFilter.SearchingValue));
                            filterExpressionBuilder.Append(String.Format(" {0} ", groupingOperatorToString));
                        }
                    }
                    if (filterExpressionBuilder.Length > 0)
                        filterExpressionBuilder.Remove(filterExpressionBuilder.Length - groupingOperatorToString.Length - 2, groupingOperatorToString.Length + 2);
                    filterExpression = filterExpressionBuilder.ToString();
                }
                //Custom search
                /*
                else if (viewModel != null)
                    filterExpression = viewModel.GetFilterExpression();
                */
            }
            
            //int totalRecords = _productsRepository.GetProductsCount(filterExpression);
            int totalRecords = 0; 
            if (!String.IsNullOrWhiteSpace(filterExpression))
                //totalRecords =  db.BienInformaticoes.Where(filterExpression).Count();
                //totalRecords =  db.BienInformaticoes.Where(x => x.BienInformaticoId.Contains(filterExpression)).Count();
                totalRecords =  db.BienInformaticoes.Where(filterExpression).Count();
            else
                totalRecords = db.BienInformaticoes.Count();

            //Fix for grouping, because it adds column name instead of index to SortingName
            // Sorting by Serial
            string sortingName = "BienInformaticoId"; 
            //string sortingName = request.SortingName.Replace("BienInformatico", "BienInformaticoId");
            
            //Prepare JqGridData instance
            JqGridResponse response = new JqGridResponse()
            {
                //Total pages count
                TotalPagesCount = (int)Math.Ceiling((float)totalRecords / (float)request.RecordsCount),
                //Page number
                PageIndex = request.PageIndex,
                //Total records count
                TotalRecordsCount = totalRecords
            };

            //Table with rows data
            /*
            foreach (Product product in _productsRepository.GetProducts(filterExpression.ToString(), sortingName, request.SortingOrder.ToString(), request.PageIndex, request.RecordsCount, request.PagesCount.HasValue ? request.PagesCount.Value : 1))
            {
                response.Records.Add(new JqGridRecord(Convert.ToString(product.ProductID), new List<object>()
                {
                    product.ProductID,
                    product.ProductName,
                    String.Format("[{0}] {1}", product.Supplier.SupplierID, product.Supplier.CompanyName),
                    product.Category.CategoryName,
                    product.QuantityPerUnit,
                    product.UnitPrice,
                    product.UnitsInStock
                }));
            }
            */
            //BienInformatico bi = db.BienInformaticoes;
            //var bis = db.BienInformaticoes.Include(b => b.nest).Include(b => b.ntib).Include(b => b.nsoc).Include(b => b.ndiv).Include(b => b.ncar).Include(b => b.nmym);

            /*
            public IQueryable<Product> GetProducts(string filterExpression, string sortExpression, string sortDirection, int pageIndex, int pageSize, int pagesCount)
            {
                */
            /*
            if (!String.IsNullOrWhiteSpace(filterExpression))
                //if (request.SortingOrder.ToString() == "asc")
                    bis = bis.Where(filterExpression).OrderBy(sortingName + " " + request.SortingOrder.ToString()).Skip(request.PageIndex * request.RecordsCount).Take(request.PagesCount.HasValue ? request.PagesCount.Value : 1);
                //else
                //    bis = bis.Where(x => x.BienInformaticoId.Contains(filterExpression)).OrderByDescending(x => x.BienInformaticoId).Skip(request.PageIndex * request.RecordsCount).Take(request.PagesCount.HasValue ? request.PagesCount.Value : 1);
            else
               // if (request.SortingOrder.ToString() == "asc")
                    bis = bis.OrderBy(sortingName + " " + request.SortingOrder.ToString()).Skip(request.PageIndex * request.RecordsCount).Take((request.PagesCount.HasValue ? request.PagesCount.Value : 1) * request.RecordsCount);
                //else
                 //   bis = bis.OrderByDescending(x => x.BienInformaticoId).Skip(request.PageIndex * request.RecordsCount).Take((request.PagesCount.HasValue ? request.PagesCount.Value : 1) * request.RecordsCount);
            //}
            */
            foreach (BienInformatico bi in GetBIs(filterExpression.ToString(), sortingName, 
                            request.SortingOrder.ToString(), request.PageIndex, 
                            request.RecordsCount, request.PagesCount.HasValue ? request.PagesCount.Value : 1, 
                            isCargoId, valueCargoId)) 
            {
                //BienInformatico bi = biIQuery;
                response.Records.Add(new JqGridRecord(Convert.ToString(bi.BienInformaticoId), new List<object>()
                {
                    //bi.ncar != null ? bi.ncar.empleados : String.Empty,
                    bi.ncar != null ? bi.ncar.empleados : String.Empty,
                    bi.CargoId != null ? bi.CargoId : String.Empty,
                    bi.BienInformaticoId,
                    bi.nest.cnom,
                    bi.ntib.cnom,
                    bi.nanf != null ? bi.nanf : String.Empty,
                    bi.dfva != null ? bi.dfva : null,
                    bi.nmym.cmod,
                    bi.ndiv != null ? bi.ndiv.cper : String.Empty,
                    bi.ceco_id != null ? bi.ceco_id : String.Empty
                }));
            }

            //Return data as json
            return new JqGridJsonResult() { Data = response };
        }

        //***********************************************************************************//
        //****                        INICIO  PROYECTO SIBI V.1.0                         ***//
        //****                             Adrian Di Puglia                               ***//
        //***********************************************************************************//
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult UpdateBI(BienInformatico viewModel)
        {

            var est_modf = 0;
            var tip_modf = 0;
            var mens = "Movimiento fue generado por Cambio en el ";

            BienInformatico bi = db.BienInformaticoes.Find(viewModel.BienInformaticoId);

            if (viewModel.EstadoId != bi.EstadoId)
            {
                est_modf = 1;
                var nom_est = (from e in db.Estadoes
                               where e.EstadoId == viewModel.EstadoId
                               select e.cnom).ToList().FirstOrDefault().ToString();
                mens = mens + "Estado " + bi.nest.cnom + " al Estado " + nom_est + ". ";
            }

            if (viewModel.TipoBienId != bi.TipoBienId)
            {
                tip_modf = 1;
                var nom_tip = (from e in db.TipoBiens
                               where e.TipoBienId == viewModel.TipoBienId
                               select e.cnom).ToList().FirstOrDefault().ToString();
                mens = mens + "Tipo de Bien " + bi.ntib.cnom + " al Tipo de Bien " + nom_tip + ".";
            }

            bi.EstadoId = viewModel.EstadoId;
            bi.TipoBienId = viewModel.TipoBienId;
            bi.nanf = viewModel.nanf;
            bi.dfva = viewModel.dfva;
            bi.MarcaModeloId = viewModel.MarcaModeloId;
            bi.DivisionId = viewModel.DivisionId;
            bi.ceco_id = viewModel.ceco_id;

            try
            {

                db.Entry(bi).State = EntityState.Modified;
                db.SaveChanges();
            }
            catch
            {
                return Json(false);
            }

            if (est_modf == 1 || tip_modf == 1)
            {
                creacionMovimiento("Entrada", mens, bi.cubf, bi.localidad_id, bi.EstadoId, bi.BienInformaticoId);
            }

            return Json(true);
        }
        //***********************************************************************************//
        //****                          FIN  PROYECTO SIBI V.1.0                          ***//
        //***********************************************************************************//

        
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult CargoId(string cargoId)
        {
            Cargo cargo = db.Cargoes.Find(cargoId);

            var cargoData = new
            {
                Nombre   = cargo.empleados,
                Cargo    = cargo.cdes,
                Ceco     = cargo.ceco,
                Division = cargo.division
            };

            return Json(cargoData);
        }

        public ActionResult Estados()
        {
            Dictionary<int, string> estados = new Dictionary<int, string>();
            foreach (Estado estado in db.Estadoes)
                estados.Add(estado.EstadoId, estado.cnom);
            return PartialView("SelectInt", estados);
        }
        
        public ActionResult TipodeBienes()
        {
            Dictionary<int, string> tipodeBienes = new Dictionary<int, string>();
            foreach (TipoBien tipodeBien in db.TipoBiens)
                tipodeBienes.Add(tipodeBien.TipoBienId, tipodeBien.cnom);
            return PartialView("SelectInt", tipodeBienes);
        }

        public ActionResult MarcaModelos()
        {
            Dictionary<int, string> marcaModelos = new Dictionary<int, string>();
            foreach (MarcaModelo marcaModelo in db.MarcaModeloes)
                marcaModelos.Add(marcaModelo.MarcaModeloId, marcaModelo.cmod);
            return PartialView("SelectInt", marcaModelos);
        }

        public ActionResult Divisiones()
        {
            Dictionary<string, string> divisiones = new Dictionary<string, string>();
            foreach (Division division in db.Divisions)
                divisiones.Add(division.DivisionId, division.cper);
            return PartialView("SelectString", divisiones);
        }

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }
    }

}